├── ARIMA.ipynb ├── ARIMA_v2.ipynb ├── Continuous_Stream_Data.py ├── Continuous_Stream_Sentiment.py ├── LSTM_FINAL.ipynb ├── LSTM_V1.ipynb ├── README.md ├── bda_data_plot.PNG ├── bitcoinprices.txt ├── engine.py ├── future_virtual_trading.py ├── get_bitcoin_new.py ├── get_bitcoin_price.py ├── get_twitter.py ├── get_twitter_new.py ├── live_bitcoin.csv ├── live_tweet.csv ├── sentiment6.txt └── tweet_data /ARIMA_v2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pyspark\n", 10 | "from pyspark import SparkContext,SQLContext\n", 11 | "sc = SparkContext.getOrCreate()" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": null, 17 | "metadata": { 18 | "collapsed": true 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "bitCoinPrices = sc.textFile('bitcoinprices.txt')" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": { 29 | "collapsed": true 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "bitCoinPrices.map(lambda x: x.split(',')).take(10)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "collapsed": true 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "bitCoinPrices=spark.read.csv('bitcoinprices.txt', mode=\"DROPMALFORMED\",inferSchema=True, header = False)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": null, 50 | "metadata": { 51 | "collapsed": true 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "bitCoinPrices = bitCoinPrices.withColumnRenamed('_c0','date').withColumnRenamed('_c1','price')" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": null, 61 | "metadata": { 62 | "collapsed": true 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "bitCoinPrices.sort('date').head(657)" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": { 73 | "collapsed": true 74 | }, 75 | "outputs": [], 76 | "source": [ 77 | "tweetSents=spark.read.csv('sentiment6.txt', mode=\"DROPMALFORMED\",inferSchema=True, header = False)" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": { 84 | "collapsed": true 85 | }, 86 | "outputs": [], 87 | "source": [ 88 | "tweetSents = tweetSents.withColumnRenamed('_c0','date').withColumnRenamed('_c1','SentimentProb')" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": null, 94 | "metadata": { 95 | "collapsed": true 96 | }, 97 | "outputs": [], 98 | "source": [ 99 | "tweetSents.sort('date').head(643)" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": null, 105 | "metadata": { 106 | "collapsed": true 107 | }, 108 | "outputs": [], 109 | "source": [ 110 | "df1 = flintContext.read.pandas(pd.read_csv(bitcoinprices.txt))" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 3, 116 | "metadata": { 117 | "collapsed": true 118 | }, 119 | "outputs": [], 120 | "source": [ 121 | "import pandas" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 2, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "ename": "NameError", 131 | "evalue": "name 'flintContext' is not defined", 132 | "output_type": "error", 133 | "traceback": [ 134 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 135 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 136 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mflintContext\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpandas\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbitcoinprices\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtxt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 137 | "\u001b[1;31mNameError\u001b[0m: name 'flintContext' is not defined" 138 | ] 139 | } 140 | ], 141 | "source": [ 142 | "df1 = flintContext.read.pandas(pd.read_csv(bitcoinprices.txt))" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 4, 148 | "metadata": {}, 149 | "outputs": [ 150 | { 151 | "ename": "ImportError", 152 | "evalue": "No module named 'ts'", 153 | "output_type": "error", 154 | "traceback": [ 155 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 156 | "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", 157 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mts\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflint\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mts\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflint\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mFlintContext\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 158 | "\u001b[1;31mImportError\u001b[0m: No module named 'ts'" 159 | ] 160 | } 161 | ], 162 | "source": [ 163 | "import ts.flint\n", 164 | "from ts.flint import FlintContext" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 19, 170 | "metadata": { 171 | "scrolled": true 172 | }, 173 | "outputs": [ 174 | { 175 | "name": "stdout", 176 | "output_type": "stream", 177 | "text": [ 178 | " ARIMA Model Results \n", 179 | "==============================================================================\n", 180 | "Dep. Variable: D.427.1 No. Observations: 655\n", 181 | "Model: ARIMA(10, 1, 0) Log Likelihood -5765.509\n", 182 | "Method: css-mle S.D. of innovations 1605.919\n", 183 | "Date: Wed, 15 Nov 2017 AIC 11555.018\n", 184 | "Time: 21:44:04 BIC 11608.833\n", 185 | "Sample: 06-13-2016 HQIC 11575.884\n", 186 | " - 05-24-2017 \n", 187 | "==================================================================================\n", 188 | " coef std err z P>|z| [0.025 0.975]\n", 189 | "----------------------------------------------------------------------------------\n", 190 | "const 0.2322 7.744 0.030 0.976 -14.946 15.410\n", 191 | "ar.L1.D.427.1 -0.9627 0.039 -24.934 0.000 -1.038 -0.887\n", 192 | "ar.L2.D.427.1 -0.9628 0.052 -18.344 0.000 -1.066 -0.860\n", 193 | "ar.L3.D.427.1 -0.9123 0.062 -14.804 0.000 -1.033 -0.791\n", 194 | "ar.L4.D.427.1 -0.9390 0.067 -14.099 0.000 -1.070 -0.808\n", 195 | "ar.L5.D.427.1 -0.8788 0.069 -12.784 0.000 -1.014 -0.744\n", 196 | "ar.L6.D.427.1 -0.8319 0.069 -12.123 0.000 -0.966 -0.697\n", 197 | "ar.L7.D.427.1 -0.6530 0.066 -9.831 0.000 -0.783 -0.523\n", 198 | "ar.L8.D.427.1 -0.5174 0.061 -8.412 0.000 -0.638 -0.397\n", 199 | "ar.L9.D.427.1 -0.3347 0.053 -6.375 0.000 -0.438 -0.232\n", 200 | "ar.L10.D.427.1 -0.1598 0.039 -4.133 0.000 -0.236 -0.084\n", 201 | " Roots \n", 202 | "==============================================================================\n", 203 | " Real Imaginary Modulus Frequency\n", 204 | "------------------------------------------------------------------------------\n", 205 | "AR.1 0.8465 -0.6878j 1.0907 -0.1086\n", 206 | "AR.2 0.8465 +0.6878j 1.0907 0.1086\n", 207 | "AR.3 0.4148 -1.1292j 1.2030 -0.1940\n", 208 | "AR.4 0.4148 +1.1292j 1.2030 0.1940\n", 209 | "AR.5 -0.2562 -1.1801j 1.2076 -0.2840\n", 210 | "AR.6 -0.2562 +1.1801j 1.2076 0.2840\n", 211 | "AR.7 -1.1750 -0.4087j 1.2441 -0.4467\n", 212 | "AR.8 -1.1750 +0.4087j 1.2441 0.4467\n", 213 | "AR.9 -0.8773 -0.9170j 1.2690 -0.3715\n", 214 | "AR.10 -0.8773 +0.9170j 1.2690 0.3715\n", 215 | "------------------------------------------------------------------------------\n" 216 | ] 217 | }, 218 | { 219 | "data": { 220 | "image/png": "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\nTkSuQmCC\n", 221 | "text/plain": [ 222 | "" 223 | ] 224 | }, 225 | "metadata": {}, 226 | "output_type": "display_data" 227 | }, 228 | { 229 | "data": { 230 | "image/png": "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\n", 231 | "text/plain": [ 232 | "" 233 | ] 234 | }, 235 | "metadata": {}, 236 | "output_type": "display_data" 237 | }, 238 | { 239 | "name": "stdout", 240 | "output_type": "stream", 241 | "text": [ 242 | " 0\n", 243 | "count 655.000000\n", 244 | "mean 4.884351\n", 245 | "std 1608.617675\n", 246 | "min -2960.046887\n", 247 | "25% -998.792861\n", 248 | "50% -468.573260\n", 249 | "75% 482.996348\n", 250 | "max 6497.914552\n" 251 | ] 252 | } 253 | ], 254 | "source": [ 255 | "from pandas import read_csv\n", 256 | "from pandas import datetime\n", 257 | "from pandas import DataFrame\n", 258 | "from statsmodels.tsa.arima_model import ARIMA\n", 259 | "from matplotlib import pyplot\n", 260 | "def parser(x):\n", 261 | " return datetime.strptime(x, '%Y%m%d')\n", 262 | "\n", 263 | "series = read_csv('bitcoinprices.txt', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)\n", 264 | "# fit model\n", 265 | "model = ARIMA(series, order=(10,1,0))\n", 266 | "model_fit = model.fit(disp=0)\n", 267 | "print(model_fit.summary())\n", 268 | "# plot residual errors\n", 269 | "residuals = DataFrame(model_fit.resid)\n", 270 | "residuals.plot()\n", 271 | "pyplot.show()\n", 272 | "residuals.plot(kind='kde')\n", 273 | "pyplot.show()\n", 274 | "print(residuals.describe())" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 44, 280 | "metadata": {}, 281 | "outputs": [ 282 | { 283 | "name": "stdout", 284 | "output_type": "stream", 285 | "text": [ 286 | "predicted=1131.924869, expected=1160.800000\n", 287 | "predicted=1170.547150, expected=1185.400000\n", 288 | "predicted=1176.787441, expected=1189.500000\n", 289 | "predicted=1205.632655, expected=1186.200000\n", 290 | "predicted=1181.409992, expected=1209.500000\n", 291 | "predicted=1207.497883, expected=1203.600000\n", 292 | "predicted=1198.542001, expected=1228.400000\n", 293 | "predicted=1234.204510, expected=1211.700000\n", 294 | "predicted=1214.034524, expected=1178.900000\n", 295 | "predicted=1179.338993, expected=1180.600000\n", 296 | "predicted=1186.100887, expected=1188.700000\n", 297 | "predicted=1188.088996, expected=1171.800000\n", 298 | "predicted=1184.020209, expected=1193.000000\n", 299 | "predicted=1190.549582, expected=1196.400000\n", 300 | "predicted=1191.032111, expected=1219.000000\n", 301 | "predicted=1218.158646, expected=1248.900000\n", 302 | "predicted=1250.968988, expected=1249.900000\n", 303 | "predicted=1247.991102, expected=1250.000000\n", 304 | "predicted=1255.063327, expected=1254.200000\n", 305 | "predicted=1251.173412, expected=1267.000000\n", 306 | "predicted=1273.833156, expected=1290.300000\n", 307 | "predicted=1294.878080, expected=1318.100000\n", 308 | "predicted=1317.511181, expected=1358.600000\n", 309 | "predicted=1355.473493, expected=1350.100000\n", 310 | "predicted=1344.784704, expected=1349.800000\n", 311 | "predicted=1350.949127, expected=1374.700000\n", 312 | "predicted=1377.227513, expected=1460.000000\n", 313 | "predicted=1464.127557, expected=1469.000000\n", 314 | "predicted=1475.129079, expected=1560.200000\n", 315 | "predicted=1555.679824, expected=1620.000000\n", 316 | "predicted=1613.594885, expected=1586.900000\n", 317 | "predicted=1583.958339, expected=1599.400000\n", 318 | "predicted=1620.590858, expected=1620.700000\n", 319 | "predicted=1617.525455, expected=1706.000000\n", 320 | "predicted=1732.566885, expected=1727.900000\n", 321 | "predicted=1737.132850, expected=1838.500000\n", 322 | "predicted=1838.684060, expected=1787.900000\n", 323 | "predicted=1784.040613, expected=1699.900000\n", 324 | "predicted=1698.041310, expected=1799.800000\n", 325 | "predicted=1824.508692, expected=1774.900000\n", 326 | "predicted=1784.460201, expected=1744.100000\n", 327 | "predicted=1789.977027, expected=1829.000000\n", 328 | "predicted=1810.583733, expected=1804.000000\n", 329 | "predicted=1776.289599, expected=1924.900000\n", 330 | "predicted=1938.665334, expected=1993.000000\n", 331 | "predicted=1982.087626, expected=2073.400000\n", 332 | "predicted=2077.787080, expected=2173.300000\n", 333 | "predicted=2173.144998, expected=2166.900000\n", 334 | "predicted=2177.340053, expected=2312.100000\n", 335 | "predicted=2353.478398, expected=2675.000000\n", 336 | "predicted=2729.538515, expected=2434.300000\n", 337 | "predicted=2521.227597, expected=2126.700000\n", 338 | "predicted=2192.437465, expected=2219.900000\n", 339 | "predicted=2267.553479, expected=2226.900000\n", 340 | "predicted=2210.937489, expected=2287.000000\n", 341 | "predicted=2382.663109, expected=2188.000000\n", 342 | "predicted=2076.024796, expected=2377.900000\n", 343 | "predicted=2427.001155, expected=2434.900000\n", 344 | "predicted=2285.718401, expected=2458.200000\n", 345 | "predicted=2465.057423, expected=2518.400000\n", 346 | "predicted=2545.356883, expected=2584.900000\n", 347 | "predicted=2531.707461, expected=2845.800000\n", 348 | "predicted=2854.724686, expected=2818.700000\n", 349 | "predicted=2784.662659, expected=2712.000000\n", 350 | "predicted=2760.327596, expected=2727.700000\n", 351 | "predicted=2753.909838, expected=2814.100000\n", 352 | "predicted=2810.864977, expected=2909.500000\n", 353 | "predicted=2898.695116, expected=2978.900000\n", 354 | "predicted=2972.391247, expected=2749.900000\n", 355 | "predicted=2749.528822, expected=2800.000000\n", 356 | "predicted=2845.162376, expected=2362.900000\n", 357 | "predicted=2355.875274, expected=2455.700000\n", 358 | "predicted=2516.245923, expected=2466.700000\n", 359 | "predicted=2482.689243, expected=2660.000000\n", 360 | "predicted=2602.144612, expected=2574.000000\n", 361 | "predicted=2560.706251, expected=2624.400000\n", 362 | "predicted=2530.643286, expected=2696.800000\n", 363 | "predicted=2764.077180, expected=2560.000000\n", 364 | "predicted=2560.586733, expected=2712.100000\n", 365 | "predicted=2745.801813, expected=2706.900000\n", 366 | "predicted=2784.942755, expected=2535.800000\n", 367 | "predicted=2540.127330, expected=2475.100000\n", 368 | "predicted=2479.719725, expected=2400.900000\n", 369 | "predicted=2435.177319, expected=2487.200000\n", 370 | "predicted=2481.743783, expected=2564.800000\n", 371 | "predicted=2554.993948, expected=2515.700000\n", 372 | "predicted=2528.072223, expected=2491.900000\n", 373 | "predicted=2477.426457, expected=2415.200000\n", 374 | "predicted=2427.048630, expected=2499.900000\n", 375 | "predicted=2528.917717, expected=2627.000000\n", 376 | "predicted=2639.786744, expected=2562.700000\n", 377 | "predicted=2569.524658, expected=2618.200000\n", 378 | "predicted=2597.334077, expected=2577.000000\n", 379 | "predicted=2576.844470, expected=2498.600000\n", 380 | "predicted=2518.992635, expected=2555.500000\n", 381 | "predicted=2569.756363, expected=2513.800000\n", 382 | "predicted=2542.963449, expected=2343.400000\n", 383 | "predicted=2350.918711, expected=2312.500000\n", 384 | "predicted=2313.503663, expected=2384.000000\n", 385 | "predicted=2404.339863, expected=2337.500000\n", 386 | "predicted=2337.357382, expected=2106.100000\n", 387 | "predicted=2128.183443, expected=1984.800000\n", 388 | "predicted=2024.570623, expected=2028.400000\n", 389 | "predicted=2044.497974, expected=2238.400000\n", 390 | "predicted=2237.037219, expected=2348.300000\n", 391 | "predicted=2335.056754, expected=2319.100000\n", 392 | "predicted=2292.173954, expected=2759.700000\n", 393 | "predicted=2757.917788, expected=2752.100000\n", 394 | "predicted=2745.357688, expected=2788.000000\n", 395 | "predicted=2805.702360, expected=2741.000000\n", 396 | "predicted=2770.701086, expected=2763.600000\n", 397 | "predicted=2775.207446, expected=2451.000000\n", 398 | "predicted=2400.437535, expected=2560.000000\n", 399 | "predicted=2516.170788, expected=2682.100000\n", 400 | "predicted=2671.490654, expected=2740.900000\n", 401 | "predicted=2669.225041, expected=2741.000000\n", 402 | "predicted=2746.130293, expected=2722.100000\n", 403 | "predicted=2728.390130, expected=2863.000000\n", 404 | "predicted=2861.590586, expected=2732.000000\n", 405 | "predicted=2740.457117, expected=2711.600000\n", 406 | "predicted=2738.536177, expected=2779.500000\n", 407 | "predicted=2785.808733, expected=3112.000000\n", 408 | "predicted=3065.507445, expected=3207.400000\n", 409 | "predicted=3167.859172, expected=3222.500000\n", 410 | "predicted=3203.455583, expected=3402.900000\n", 411 | "predicted=3403.932412, expected=3402.500000\n", 412 | "predicted=3372.562346, expected=3362.000000\n", 413 | "predicted=3335.927739, expected=3473.200000\n", 414 | "predicted=3497.394115, expected=3761.800000\n", 415 | "predicted=3755.427507, expected=4094.500000\n", 416 | "predicted=4072.590915, expected=4074.900000\n", 417 | "predicted=4061.443886, expected=4220.000000\n", 418 | "predicted=4249.376390, expected=4061.300000\n", 419 | "predicted=4055.315128, expected=4319.000000\n", 420 | "predicted=4318.599109, expected=4269.800000\n", 421 | "predicted=4334.075520, expected=4045.400000\n", 422 | "predicted=4064.022979, expected=4098.000000\n", 423 | "predicted=4112.813583, expected=4002.100000\n", 424 | "predicted=4007.746395, expected=3847.400000\n", 425 | "predicted=3799.196501, expected=4090.200000\n", 426 | "predicted=4095.203236, expected=4164.000000\n", 427 | "predicted=4179.896762, expected=4320.000000\n", 428 | "predicted=4285.863197, expected=4320.500000\n", 429 | "predicted=4324.302924, expected=4356.000000\n", 430 | "predicted=4381.049635, expected=4265.500000\n", 431 | "predicted=4256.278756, expected=4371.200000\n", 432 | "predicted=4380.932643, expected=4604.000000\n", 433 | "predicted=4634.811493, expected=4610.200000\n", 434 | "predicted=4607.534484, expected=4713.300000\n", 435 | "predicted=4711.653426, expected=4750.000000\n", 436 | "predicted=4755.003398, expected=4660.000000\n", 437 | "predicted=4652.487901, expected=4566.700000\n", 438 | "predicted=4575.943206, expected=4337.300000\n", 439 | "predicted=4365.519103, expected=4510.500000\n", 440 | "predicted=4521.438243, expected=4538.700000\n", 441 | "predicted=4537.225584, expected=4621.700000\n", 442 | "predicted=4626.139651, expected=4436.600000\n", 443 | "predicted=4440.605955, expected=4280.100000\n", 444 | "predicted=4272.733130, expected=4184.100000\n", 445 | "predicted=4179.631284, expected=4347.700000\n", 446 | "predicted=4377.896937, expected=4020.800000\n", 447 | "predicted=4061.150513, expected=3830.600000\n", 448 | "predicted=3832.917484, expected=3167.300000\n", 449 | "predicted=3148.843922, expected=3789.900000\n", 450 | "predicted=3721.181918, expected=3643.200000\n", 451 | "predicted=3745.897799, expected=3900.000000\n", 452 | "predicted=3708.258332, expected=3969.200000\n", 453 | "predicted=4052.890232, expected=3944.900000\n", 454 | "predicted=3899.139036, expected=3871.900000\n", 455 | "predicted=3898.634597, expected=3753.200000\n", 456 | "predicted=3763.655407, expected=3712.900000\n", 457 | "predicted=3799.038340, expected=3659.900000\n", 458 | "predicted=3595.991489, expected=3773.000000\n", 459 | "predicted=3810.407828, expected=3886.700000\n", 460 | "predicted=3883.985961, expected=3933.600000\n", 461 | "predicted=3934.820535, expected=4197.900000\n", 462 | "predicted=4177.994727, expected=4051.800000\n", 463 | "predicted=4076.279921, expected=4244.900000\n", 464 | "predicted=4186.023139, expected=4315.000000\n", 465 | "predicted=4348.559501, expected=4409.000000\n", 466 | "predicted=4396.137765, expected=4292.000000\n", 467 | "predicted=4302.816002, expected=4332.300000\n", 468 | "predicted=4339.602687, expected=4157.600000\n", 469 | "predicted=4200.457495, expected=4394.700000\n", 470 | "predicted=4350.026625, expected=4345.000000\n", 471 | "predicted=4423.837030, expected=4463.600000\n", 472 | "predicted=4414.030733, expected=4561.000000\n", 473 | "predicted=4590.717464, expected=4827.000000\n", 474 | "predicted=4804.070276, expected=4764.100000\n", 475 | "predicted=4791.744934, expected=4896.900000\n", 476 | "predicted=4848.183540, expected=5511.700000\n", 477 | "predicted=5526.703045, expected=5585.700000\n", 478 | "predicted=5611.475654, expected=5739.900000\n", 479 | "predicted=5726.468306, expected=5661.000000\n", 480 | "predicted=5739.215874, expected=5637.600000\n", 481 | "predicted=5638.735624, expected=5372.200000\n", 482 | "predicted=5390.497509, expected=5572.300000\n", 483 | "predicted=5584.648964, expected=5691.400000\n", 484 | "predicted=5746.262773, expected=6080.000000\n", 485 | "predicted=6061.883044, expected=5861.700000\n", 486 | "predicted=5940.101643, expected=5996.000000\n", 487 | "predicted=5918.916990, expected=5820.500000\n", 488 | "predicted=5887.679333, expected=5470.000000\n", 489 | "predicted=5441.629503, expected=5735.000000\n", 490 | "predicted=5755.150264, expected=5895.000000\n", 491 | "predicted=5972.697175, expected=5768.100000\n", 492 | "predicted=5771.727576, expected=5795.000000\n", 493 | "predicted=5778.850580, expected=6125.000000\n", 494 | "predicted=6108.006964, expected=6135.300000\n", 495 | "predicted=6096.833865, expected=6406.500000\n", 496 | "predicted=6404.500817, expected=6657.300000\n", 497 | "predicted=6695.266464, expected=7210.100000\n", 498 | "predicted=7164.324354, expected=7191.000000\n", 499 | "predicted=7266.238541, expected=7489.900000\n", 500 | "predicted=7512.093253, expected=7316.700000\n", 501 | "predicted=7407.825367, expected=7186.800000\n", 502 | "predicted=7135.793483, expected=7364.300000\n", 503 | "predicted=7440.824509, expected=7376.900000\n", 504 | "predicted=7435.657469, expected=7195.000000\n", 505 | "predicted=7208.926001, expected=6704.100000\n", 506 | "predicted=6700.998647, expected=6079.300000\n", 507 | "predicted=5965.979839, expected=6241.000000\n", 508 | "predicted=6174.557138, expected=6570.000000\n", 509 | "predicted=6682.627290, expected=6565.000000\n" 510 | ] 511 | } 512 | ], 513 | "source": [ 514 | "from pandas import read_csv\n", 515 | "from pandas import datetime\n", 516 | "from pandas import DataFrame\n", 517 | "from statsmodels.tsa.arima_model import ARIMA\n", 518 | "from matplotlib import pyplot\n", 519 | "import numpy as np\n", 520 | "def parser(x): \n", 521 | " return datetime.strptime(x, '%Y-%m-%d')\n", 522 | "\n", 523 | "series = read_csv('bitcoinsort.csv', header='infer', dtype={'time':np.str,'price':np.float64},parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)\n", 524 | "\n", 525 | "X = series.values\n", 526 | "size = int(len(X) * 0.66)\n", 527 | "train, test = X[0:size], X[size:len(X)]\n", 528 | "history = [x for x in train]\n", 529 | "predictions = list()\n", 530 | "for t in range(len(test)):\n", 531 | " model = ARIMA(history, order=(10,1,0))\n", 532 | " model_fit = model.fit(disp=0)\n", 533 | " output = model_fit.forecast()\n", 534 | " yhat = output[0]\n", 535 | " predictions.append(yhat)\n", 536 | " obs = test[t]\n", 537 | " history.append(obs)\n", 538 | " print('predicted=%f, expected=%f' % (yhat, obs))" 539 | ] 540 | }, 541 | { 542 | "cell_type": "code", 543 | "execution_count": 30, 544 | "metadata": {}, 545 | "outputs": [ 546 | { 547 | "data": { 548 | "text/html": [ 549 | "
\n", 550 | "\n", 563 | "\n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | "
timeprice
02016-02-27427.1
12016-11-18750.9
22016-06-13690.9
32016-08-08588.7
42017-02-061047.3
\n", 599 | "
" 600 | ], 601 | "text/plain": [ 602 | " time price\n", 603 | "0 2016-02-27 427.1\n", 604 | "1 2016-11-18 750.9\n", 605 | "2 2016-06-13 690.9\n", 606 | "3 2016-08-08 588.7\n", 607 | "4 2017-02-06 1047.3" 608 | ] 609 | }, 610 | "execution_count": 30, 611 | "metadata": {}, 612 | "output_type": "execute_result" 613 | } 614 | ], 615 | "source": [ 616 | "from pandas import read_csv\n", 617 | "from pandas import datetime\n", 618 | "from pandas import DataFrame\n", 619 | "from statsmodels.tsa.arima_model import ARIMA\n", 620 | "from matplotlib import pyplot\n", 621 | "def parser(x):\n", 622 | " return datetime.strptime(x, '%Y%m%d')\n", 623 | "\n", 624 | "y = read_csv('bitcoinprices.txt', header=None,names=['time','price'], parse_dates=[0], index_col=False, squeeze=True, date_parser=parser)\n", 625 | "y.head()\n" 626 | ] 627 | }, 628 | { 629 | "cell_type": "code", 630 | "execution_count": 42, 631 | "metadata": {}, 632 | "outputs": [], 633 | "source": [ 634 | "#x=y.sort([\"time\"])\n", 635 | "x = y.sort_values('time',axis=0)\n", 636 | "x.to_csv('bitcoinsort.csv', index=False)" 637 | ] 638 | }, 639 | { 640 | "cell_type": "code", 641 | "execution_count": 45, 642 | "metadata": {}, 643 | "outputs": [ 644 | { 645 | "name": "stdout", 646 | "output_type": "stream", 647 | "text": [ 648 | "Test MSE: 32409.630\n" 649 | ] 650 | }, 651 | { 652 | "data": { 653 | "image/png": "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\n1ORmAAAAAElFTkSuQmCC\n", 654 | "text/plain": [ 655 | "" 656 | ] 657 | }, 658 | "metadata": {}, 659 | "output_type": "display_data" 660 | } 661 | ], 662 | "source": [ 663 | "from sklearn.metrics import mean_squared_error\n", 664 | "error = mean_squared_error(test, predictions)\n", 665 | "print('Test MSE: %.3f' % error)\n", 666 | "# plot\n", 667 | "pyplot.plot(test)\n", 668 | "pyplot.plot(predictions, color='red')\n", 669 | "pyplot.show()" 670 | ] 671 | }, 672 | { 673 | "cell_type": "code", 674 | "execution_count": null, 675 | "metadata": { 676 | "collapsed": true 677 | }, 678 | "outputs": [], 679 | "source": [] 680 | } 681 | ], 682 | "metadata": { 683 | "kernelspec": { 684 | "display_name": "Python 3", 685 | "language": "python", 686 | "name": "python3" 687 | }, 688 | "language_info": { 689 | "codemirror_mode": { 690 | "name": "ipython", 691 | "version": 3 692 | }, 693 | "file_extension": ".py", 694 | "mimetype": "text/x-python", 695 | "name": "python", 696 | "nbconvert_exporter": "python", 697 | "pygments_lexer": "ipython3", 698 | "version": "3.6.3" 699 | } 700 | }, 701 | "nbformat": 4, 702 | "nbformat_minor": 2 703 | } 704 | -------------------------------------------------------------------------------- /Continuous_Stream_Data.py: -------------------------------------------------------------------------------- 1 | 2 | # coding: utf-8 3 | 4 | # In[1]: 5 | 6 | 7 | import requests 8 | import time 9 | import datetime 10 | 11 | f_name = input("dataset name:") 12 | f = open(f_name,"a") 13 | keys = ["price_usd","24h_volume_usd","market_cap_usd","available_supply","total_supply","percent_change_1h","percent_change_24h","percent_change_7d"] 14 | vals = [0]*len(keys) 15 | 16 | while True: 17 | data = requests.get("https://api.coinmarketcap.com/v1/ticker/bitcoin/").json()[0] 18 | #bstamp = requests.get("https://www.bitstamp.net/api/v2/ticker/btcusd/").json() 19 | bkc = requests.get("https://blockchain.info/ticker").json() 20 | for d in data.keys(): 21 | if d in keys: 22 | indx = keys.index(d) 23 | vals[indx] = data[d] 24 | for val in vals: 25 | f.write(val+",") 26 | 27 | #f.write("{},{},".format(bstamp["volume"],bstamp["vwap"])) 28 | f.write("{},{},{}".format(bkc["USD"]["sell"],bkc["USD"]["buy"],bkc["USD"]["15m"])) 29 | f.write(","+datetime.datetime.now().strftime("%y-%m-%d-%H-%M")) 30 | f.write("\n") 31 | f.flush() 32 | time.sleep(60) 33 | 34 | -------------------------------------------------------------------------------- /Continuous_Stream_Sentiment.py: -------------------------------------------------------------------------------- 1 | # import tweepy library for twitter api access and textblob libary for sentiment analysis 2 | import csv 3 | import tweepy 4 | import numpy as np 5 | from textblob import TextBlob 6 | import datetime 7 | import time 8 | 9 | def main(): 10 | 11 | # set twitter api credentials 12 | consumer_key= 'MOe623rxcqck6x8y5XhzK8MJT' 13 | consumer_secret= 'mcBq9Km1f3OYERRD6vKmOfWSgCjsqzXAreIsn8klxAtPIo40E7' 14 | access_token='913787859630460928-RXF8NVN3gGbxD64NCZ7wBma5M2WPwlv' 15 | access_token_secret='P4UU9I2DimdnUown2EM6p4WZ0ftdPNsysDNW6xGh0Ts4f' 16 | 17 | # set path of csv file to save sentiment stats 18 | path = 'live_tweet.csv' 19 | f = open(path,"a") 20 | f1 = open('tweet_data','a') 21 | # access twitter api via tweepy methods 22 | auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 23 | auth.set_access_token(access_token, access_token_secret) 24 | twitter_api = tweepy.API(auth) 25 | 26 | while True: 27 | 28 | # fetch tweets by keywords 29 | tweets = twitter_api.search(q=['bitcoin, price, crypto'], count=100) 30 | 31 | # get polarity 32 | polarity = get_polarity(tweets,f1) 33 | sentiment = np.mean(polarity) 34 | 35 | # save sentiment data to csv file 36 | f.write(str(sentiment)) 37 | f.write(","+datetime.datetime.now().strftime("%y-%m-%d-%H-%M")) 38 | f.write("\n") 39 | f.flush() 40 | time.sleep(60) 41 | 42 | 43 | def get_polarity(tweets,f): 44 | # run polarity analysis on tweets 45 | 46 | tweet_polarity = [] 47 | 48 | for tweet in tweets: 49 | f.write(tweet.text+'\n') 50 | analysis = TextBlob(tweet.text) 51 | tweet_polarity.append(analysis.sentiment.polarity) 52 | 53 | return tweet_polarity 54 | 55 | main() 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | This is the code for [this](https://youtu.be/EqWm8A-dRYg) video on Youtube by Siraj Raval on Bitcoin Prediction. 4 | 5 | ##### Usage ##### 6 | The entire setup works on Google cloud. 7 | 8 | ##### Part 1: Data Gathering: ##### 9 | In order to capture the real-time data, we run the following two python programs in background to continuously fetch the data. 10 | a) Continuous_Stream_Data.py 11 | b) Continuous_Stream_Sentiment.py 12 | 13 | The two code do the preprocessing of data and store them in “live_tweet.csv” and “live_bitcoin.csv” files. 14 | 15 | ##### Part 2: Core Engine: ##### 16 | From the experiments we found LSTM based model to be performing better than ARIMA (discussed in detail in next section). We have set our best model parameters in engine.py file and once it is run it gathers data from the “live_bitcoin.csv” and “live_tweet.csv”, and generate features in real-time and is fed into the model. 17 | 18 | The model outputs the next price. It also does a computation based on the threshold set in the code (this is fed from the settings file). 19 | 20 | The information about the time stamp, predicted price, current real price and buy/sell decision is then written into a mysql database 21 | 22 | ##### Part 3: Tableau and Notification system: ##### 23 | 24 | We have used Tableau to generate plots in real-time form the sql-database mentioned in previous section. 25 | 26 | 27 | 28 | # Credits 29 | 30 | Credits for this code go to [sapphirine](https://github.com/Sapphirine/BITCOIN-PRICE-PREDICTION-USING-SENTIMENT-ANALYSIS). I've merely created a wrapper to get people started. 31 | -------------------------------------------------------------------------------- /bda_data_plot.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llSourcell/bitcoin_prediction/dcba51a72f7e1a33e631703b48d9fea2a2e9b478/bda_data_plot.PNG -------------------------------------------------------------------------------- /bitcoinprices.txt: -------------------------------------------------------------------------------- 1 | 20160227,427.1 2 | 20161118,750.9 3 | 20160613,690.9 4 | 20160808,588.7 5 | 20170206,1047.3 6 | 20161125,737.3 7 | 20170724,2763.6 8 | 20161007,619.5 9 | 20170422,1250.0 10 | 20171015,5661.0 11 | 20161001,613.1 12 | 20170305,1281.7 13 | 20160730,636.0 14 | 20160907,614.8 15 | 20170123,917.9 16 | 20170624,2535.8 17 | 20170501,1460.0 18 | 20170810,3473.2 19 | 20170930,4315.0 20 | 20160326,416.9 21 | 20160609,577.7 22 | 20160804,572.8 23 | 20170226,1184.1 24 | 20170612,2749.9 25 | 20170728,2740.9 26 | 20170418,1196.4 27 | 20171019,5691.4 28 | 20161018,636.7 29 | 20170301,1227.4 30 | 20160726,655.8 31 | 20160911,608.7 32 | 20161209,770.5 33 | 20170529,2287.0 34 | 20170814,4220.0 35 | 20160309,411.5 36 | 20160219,425.9 37 | 20160605,583.5 38 | 20160519,442.4 39 | 20161024,655.1 40 | 20170608,2727.7 41 | 20170716,2028.4 42 | 20161013,635.1 43 | 20170901,4750.0 44 | 20171023,5820.5 45 | 20160717,681.5 46 | 20161111,715.0 47 | 20170313,1241.4 48 | 20160722,659.0 49 | 20161115,711.3 50 | 20170525,2434.3 51 | 20170818,4045.4 52 | 20170526,2126.7 53 | 20160223,421.4 54 | 20170419,1219.0 55 | 20160601,538.2 56 | 20170110,915.8 57 | 20170218,1066.4 58 | 20170604,2584.9 59 | 20170720,2759.7 60 | 20160221,438.8 61 | 20161103,688.1 62 | 20170905,4510.5 63 | 20171027,5768.1 64 | 20160831,572.6 65 | 20160428,450.3 66 | 20170309,1192.5 67 | 20160526,473.3 68 | 20160718,675.6 69 | 20160919,609.3 70 | 20170415,1188.7 71 | 20170521,2173.3 72 | 20170822,4090.2 73 | 20160301,432.8 74 | 20160629,639.7 75 | 20170114,824.0 76 | 20170222,1132.2 77 | 20161114,710.1 78 | 20160513,457.6 79 | 20160224,424.0 80 | 20170909,4280.1 81 | 20171031,6406.5 82 | 20160130,381.6 83 | 20160419,437.7 84 | 20160827,571.6 85 | 20161020,629.3 86 | 20170321,1089.9 87 | 20170711,2312.5 88 | 20160923,605.1 89 | 20170411,1228.4 90 | 20170517,1804.0 91 | 20170826,4356.0 92 | 20160305,399.1 93 | 20160625,662.2 94 | 20170102,1018.8 95 | 20170628,2564.8 96 | 20161110,714.5 97 | 20170913,3830.6 98 | 20160210,375.9 99 | 20160502,447.0 100 | 20160823,578.7 101 | 20161109,716.9 102 | 20170317,1058.1 103 | 20161003,610.4 104 | 20170715,1984.8 105 | 20160927,603.5 106 | 20170407,1189.5 107 | 20170830,4610.2 108 | 20170520,2073.4 109 | 20160715,669.3 110 | 20160621,651.0 111 | 20170106,846.2 112 | 20171111,6079.3 113 | 20161027,685.2 114 | 20161011,640.1 115 | 20170917,3900.0 116 | 20160214,406.8 117 | 20160819,574.5 118 | 20170211,1012.5 119 | 20170329,1045.6 120 | 20170703,2627.0 121 | 20160523,446.2 122 | 20170403,1155.3 123 | 20171004,4157.6 124 | 20160411,429.4 125 | 20160329,413.0 126 | 20160711,650.1 127 | 20160617,750.0 128 | 20170126,920.7 129 | 20170512,1699.9 130 | 20171107,7364.3 131 | 20160515,458.7 132 | 20161102,738.6 133 | 20170921,3753.2 134 | 20160202,372.9 135 | 20160815,567.5 136 | 20170215,1024.1 137 | 20170325,967.8 138 | 20170707,2498.6 139 | 20161123,738.8 140 | 20161213,780.3 141 | 20171008,4561.0 142 | 20160415,433.2 143 | 20160317,415.6 144 | 20160707,641.4 145 | 20170130,934.9 146 | 20161105,717.7 147 | 20170508,1706.0 148 | 20170616,2466.7 149 | 20160319,410.6 150 | 20170803,2779.5 151 | 20170925,3886.7 152 | 20160206,376.0 153 | 20160528,520.0 154 | 20160811,590.2 155 | 20170203,1014.4 156 | 20170727,2682.1 157 | 20160709,650.9 158 | 20170427,1358.6 159 | 20171012,5511.7 160 | 20160311,416.4 161 | 20160619,763.1 162 | 20160403,419.9 163 | 20170522,2166.9 164 | 20160703,666.1 165 | 20160904,609.3 166 | 20170118,887.9 167 | 20160527,493.2 168 | 20161210,766.9 169 | 20160410,421.8 170 | 20161120,727.4 171 | 20170807,3402.9 172 | 20170929,4244.9 173 | 20160226,426.6 174 | 20160612,680.6 175 | 20160807,591.1 176 | 20170207,1067.9 177 | 20170731,2863.0 178 | 20160517,456.5 179 | 20170423,1254.2 180 | 20171016,5637.6 181 | 20160131,375.3 182 | 20160407,422.1 183 | 20170304,1252.1 184 | 20160731,633.4 185 | 20160908,622.0 186 | 20170122,924.5 187 | 20161214,779.9 188 | 20160509,462.0 189 | 20161017,638.9 190 | 20170811,3761.8 191 | 20160310,418.8 192 | 20160608,580.2 193 | 20160803,582.8 194 | 20170227,1192.6 195 | 20170613,2800.0 196 | 20170719,2319.1 197 | 20160630,684.0 198 | 20161219,789.6 199 | 20171020,6080.0 200 | 20161022,648.3 201 | 20160727,657.0 202 | 20160912,608.7 203 | 20170528,2226.9 204 | 20170815,4061.3 205 | 20160314,414.8 206 | 20160218,417.7 207 | 20160813,586.5 208 | 20170109,904.0 209 | 20161113,705.1 210 | 20170609,2814.1 211 | 20170723,2741.0 212 | 20161026,686.8 213 | 20171024,5470.0 214 | 20170312,1233.6 215 | 20160723,656.7 216 | 20160916,608.2 217 | 20161222,861.0 218 | 20160213,397.7 219 | 20160426,470.1 220 | 20161217,790.7 221 | 20170819,4098.0 222 | 20160302,415.4 223 | 20160222,434.5 224 | 20170113,829.9 225 | 20170219,1060.4 226 | 20170605,2845.8 227 | 20160529,528.8 228 | 20170904,4337.3 229 | 20171028,5795.0 230 | 20160830,572.6 231 | 20161012,638.0 232 | 20170308,1173.4 233 | 20160719,671.9 234 | 20160920,599.3 235 | 20170412,1211.7 236 | 20161226,896.8 237 | 20161218,794.8 238 | 20160511,456.5 239 | 20170823,4164.0 240 | 20160306,404.8 241 | 20160628,637.3 242 | 20170101,997.9 243 | 20170223,1199.9 244 | 20170601,2434.9 245 | 20160611,636.3 246 | 20170908,4436.6 247 | 20160209,374.9 248 | 20161206,753.9 249 | 20160826,575.9 250 | 20160423,458.4 251 | 20170320,1047.0 252 | 20170710,2343.4 253 | 20160924,603.2 254 | 20161002,614.9 255 | 20170408,1186.2 256 | 20161230,958.7 257 | 20170827,4265.5 258 | 20171106,7186.8 259 | 20160624,683.2 260 | 20170105,1001.6 261 | 20170629,2515.7 262 | 20170516,1829.0 263 | 20171114,6565.0 264 | 20160520,444.8 265 | 20170912,4020.8 266 | 20161121,729.0 267 | 20160525,450.6 268 | 20160822,585.9 269 | 20170208,1055.4 270 | 20170518,1924.9 271 | 20160208,370.4 272 | 20170714,2106.1 273 | 20170623,2706.9 274 | 20170404,1144.0 275 | 20171001,4409.0 276 | 20160424,464.9 277 | 20160414,426.1 278 | 20170831,4713.3 279 | 20160330,414.0 280 | 20160712,669.3 281 | 20160620,704.8 282 | 20170125,901.3 283 | 20161204,757.6 284 | 20170625,2475.1 285 | 20170618,2574.0 286 | 20161215,780.4 287 | 20160818,572.9 288 | 20170212,1009.0 289 | 20170328,1015.3 290 | 20170702,2499.9 291 | 20160915,606.0 292 | 20171005,4394.7 293 | 20160505,449.0 294 | 20160512,455.8 295 | 20161104,704.0 296 | 20160318,409.5 297 | 20160708,659.1 298 | 20160616,718.8 299 | 20170129,919.1 300 | 20161028,702.3 301 | 20170515,1744.1 302 | 20170621,2560.0 303 | 20170316,1123.1 304 | 20160402,419.3 305 | 20161223,911.8 306 | 20160205,374.0 307 | 20161009,617.7 308 | 20160814,572.3 309 | 20170324,901.0 310 | 20170706,2577.0 311 | 20161004,610.0 312 | 20170428,1350.1 313 | 20171009,4827.0 314 | 20160321,415.9 315 | 20160928,605.8 316 | 20160322,417.3 317 | 20160704,678.3 318 | 20160901,570.9 319 | 20170117,904.7 320 | 20161117,740.0 321 | 20170511,1787.9 322 | 20170617,2660.0 323 | 20160530,533.8 324 | 20170924,3773.0 325 | 20161216,788.9 326 | 20160313,414.8 327 | 20160810,593.1 328 | 20170204,1030.1 329 | 20170726,2560.0 330 | 20160216,411.9 331 | 20170424,1267.0 332 | 20171013,5585.7 333 | 20160430,454.3 334 | 20161119,751.4 335 | 20161019,628.9 336 | 20170307,1188.0 337 | 20160905,606.8 338 | 20170121,939.7 339 | 20170504,1620.0 340 | 20170507,1620.7 341 | 20170804,3112.0 342 | 20170928,4051.8 343 | 20160229,433.3 344 | 20161014,639.0 345 | 20160615,699.2 346 | 20160806,593.9 347 | 20170224,1184.9 348 | 20170730,2722.1 349 | 20160917,607.5 350 | 20170420,1248.9 351 | 20171017,5372.2 352 | 20160507,462.7 353 | 20161205,755.7 354 | 20170303,1293.1 355 | 20160728,657.5 356 | 20160909,620.1 357 | 20161030,695.0 358 | 20170503,1560.2 359 | 20170808,3402.5 360 | 20170527,2219.9 361 | 20160217,418.4 362 | 20161106,717.8 363 | 20171105,7316.7 364 | 20160802,543.6 365 | 20170228,1202.7 366 | 20170614,2362.9 367 | 20170718,2348.3 368 | 20161006,613.4 369 | 20170416,1171.8 370 | 20171021,5861.7 371 | 20160408,417.6 372 | 20161126,733.9 373 | 20160930,612.3 374 | 20170315,1245.4 375 | 20160724,660.0 376 | 20160913,608.4 377 | 20171110,6704.1 378 | 20170531,2377.9 379 | 20170812,4094.5 380 | 20160315,414.2 381 | 20161023,649.9 382 | 20160607,573.8 383 | 20170108,891.6 384 | 20170216,1039.9 385 | 20170610,2909.5 386 | 20170722,2788.0 387 | 20170903,4566.7 388 | 20171025,5735.0 389 | 20161021,629.8 390 | 20170311,1189.4 391 | 20170916,3643.2 392 | 20160720,664.9 393 | 20171102,7210.1 394 | 20161208,769.2 395 | 20161221,861.7 396 | 20160201,373.3 397 | 20170816,4319.0 398 | 20160303,421.7 399 | 20160603,580.0 400 | 20170112,788.6 401 | 20170220,1093.5 402 | 20170606,2818.7 403 | 20170907,4621.7 404 | 20171029,6125.0 405 | 20160128,377.1 406 | 20161129,730.3 407 | 20160829,575.4 408 | 20161108,742.4 409 | 20170323,1048.8 410 | 20160716,669.4 411 | 20160921,597.0 412 | 20170413,1178.9 413 | 20170523,2312.1 414 | 20170820,4002.1 415 | 20161227,948.9 416 | 20170602,2458.2 417 | 20161008,617.2 418 | 20170911,4347.7 419 | 20160418,431.8 420 | 20160825,576.2 421 | 20161203,765.7 422 | 20170319,1022.4 423 | 20170709,2513.8 424 | 20160925,601.3 425 | 20170409,1209.5 426 | 20170519,1993.0 427 | 20160531,527.2 428 | 20170824,4320.0 429 | 20160327,423.5 430 | 20161116,748.2 431 | 20160627,648.6 432 | 20170104,1169.7 433 | 20161101,726.4 434 | 20170630,2491.9 435 | 20160514,460.0 436 | 20170626,2400.9 437 | 20170915,3789.9 438 | 20160212,389.0 439 | 20160422,447.6 440 | 20160821,580.9 441 | 20170209,985.3 442 | 20170331,1088.5 443 | 20170713,2337.5 444 | 20160929,606.2 445 | 20170405,1160.8 446 | 20171002,4292.0 447 | 20170828,4371.2 448 | 20160331,415.4 449 | 20160713,655.9 450 | 20160623,674.0 451 | 20170124,894.1 452 | 20171109,7195.0 453 | 20160325,416.1 454 | 20170919,3944.9 455 | 20160503,449.0 456 | 20160817,574.2 457 | 20170213,1005.3 458 | 20170327,1039.0 459 | 20170701,2415.2 460 | 20170401,1089.9 461 | 20171006,4345.0 462 | 20160522,442.9 463 | 20160409,420.8 464 | 20161225,900.1 465 | 20161127,734.8 466 | 20161130,742.4 467 | 20161229,972.1 468 | 20170128,923.7 469 | 20170514,1774.9 470 | 20170622,2712.1 471 | 20161010,618.9 472 | 20170923,3659.9 473 | 20160204,384.0 474 | 20161112,694.0 475 | 20170201,988.9 476 | 20170705,2618.2 477 | 20160516,456.5 478 | 20170429,1349.8 479 | 20171010,4764.1 480 | 20160413,425.3 481 | 20160323,415.9 482 | 20160705,671.0 483 | 20160902,575.4 484 | 20170116,892.1 485 | 20170510,1838.5 486 | 20171101,6657.3 487 | 20160508,459.8 488 | 20170801,2732.0 489 | 20170927,4197.9 490 | 20160501,456.9 491 | 20160416,433.9 492 | 20160809,584.6 493 | 20170205,1019.8 494 | 20170920,3871.9 495 | 20170725,2451.0 496 | 20170425,1290.3 497 | 20171014,5739.9 498 | 20160401,419.0 499 | 20170306,1278.5 500 | 20160701,680.6 501 | 20160906,610.6 502 | 20170120,920.4 503 | 20170506,1599.4 504 | 20160316,417.8 505 | 20170805,3207.4 506 | 20160420,440.0 507 | 20160228,434.6 508 | 20160614,683.5 509 | 20160805,579.0 510 | 20170225,1159.9 511 | 20161202,771.3 512 | 20170729,2741.0 513 | 20161124,730.2 514 | 20170421,1249.9 515 | 20171018,5572.3 516 | 20160405,422.0 517 | 20170302,1271.5 518 | 20160729,657.4 519 | 20160910,623.0 520 | 20170502,1469.0 521 | 20160427,443.3 522 | 20170809,3362.0 523 | 20160308,409.9 524 | 20160524,449.1 525 | 20161015,641.9 526 | 20160610,585.8 527 | 20160801,603.5 528 | 20161207,765.8 529 | 20170615,2455.7 530 | 20170717,2238.4 531 | 20160518,455.5 532 | 20160412,428.7 533 | 20170417,1193.0 534 | 20171022,5996.0 535 | 20170627,2487.2 536 | 20160425,468.5 537 | 20170314,1249.5 538 | 20160725,647.0 539 | 20160914,607.5 540 | 20170530,2188.0 541 | 20160510,455.6 542 | 20170813,4074.9 543 | 20160312,413.5 544 | 20160220,439.2 545 | 20160604,580.8 546 | 20160606,586.3 547 | 20170111,758.1 548 | 20170217,1069.5 549 | 20160307,414.0 550 | 20170611,2978.9 551 | 20170721,2752.1 552 | 20170902,4660.0 553 | 20171026,5895.0 554 | 20160404,422.4 555 | 20160429,455.1 556 | 20170310,1196.8 557 | 20161231,964.0 558 | 20160721,669.3 559 | 20160918,610.2 560 | 20171103,7191.0 561 | 20170414,1180.6 562 | 20161220,810.8 563 | 20170817,4269.8 564 | 20160406,421.8 565 | 20160602,536.9 566 | 20170115,836.5 567 | 20170221,1114.2 568 | 20170607,2712.0 569 | 20170906,4538.7 570 | 20171030,6135.3 571 | 20160129,380.2 572 | 20160828,574.5 573 | 20160417,433.3 574 | 20170322,1032.0 575 | 20161025,658.0 576 | 20160922,596.7 577 | 20170410,1203.6 578 | 20161224,875.1 579 | 20170821,3847.4 580 | 20160304,397.5 581 | 20170926,3933.6 582 | 20170103,1064.9 583 | 20161212,779.1 584 | 20170603,2518.4 585 | 20170910,4184.1 586 | 20160211,379.2 587 | 20160824,574.5 588 | 20160421,446.9 589 | 20170318,964.4 590 | 20170708,2555.5 591 | 20160926,606.3 592 | 20170406,1185.4 593 | 20161228,982.1 594 | 20160504,448.5 595 | 20170825,4320.5 596 | 20160324,413.8 597 | 20160714,660.9 598 | 20160626,657.9 599 | 20170107,942.2 600 | 20161029,718.6 601 | 20171112,6241.0 602 | 20170914,3167.3 603 | 20160215,400.9 604 | 20160225,423.9 605 | 20160820,583.9 606 | 20170210,1012.5 607 | 20170330,1049.7 608 | 20170712,2384.0 609 | 20161201,754.0 610 | 20161005,612.7 611 | 20170402,1153.6 612 | 20171003,4332.3 613 | 20170829,4604.0 614 | 20160328,423.5 615 | 20160710,651.4 616 | 20160622,594.9 617 | 20170127,924.0 618 | 20171113,6570.0 619 | 20170513,1799.8 620 | 20171108,7376.9 621 | 20161107,705.3 622 | 20170918,3969.2 623 | 20160203,371.4 624 | 20160816,579.1 625 | 20170214,1009.4 626 | 20170326,972.3 627 | 20161122,745.1 628 | 20170430,1374.7 629 | 20171007,4463.6 630 | 20161016,638.9 631 | 20170620,2696.8 632 | 20160706,650.1 633 | 20160618,757.3 634 | 20170131,977.9 635 | 20170505,1586.9 636 | 20170509,1727.9 637 | 20171104,7489.9 638 | 20170802,2711.6 639 | 20170922,3712.9 640 | 20160207,379.1 641 | 20160521,445.1 642 | 20160812,588.4 643 | 20170202,1015.7 644 | 20170704,2562.7 645 | 20170426,1318.1 646 | 20171011,4896.9 647 | 20160506,460.2 648 | 20161128,730.9 649 | 20160320,408.9 650 | 20160702,690.9 651 | 20160903,598.7 652 | 20170119,898.4 653 | 20161031,712.0 654 | 20161211,772.7 655 | 20170619,2624.4 656 | 20170806,3222.5 657 | 20170524,2675.0 658 | -------------------------------------------------------------------------------- /engine.py: -------------------------------------------------------------------------------- 1 | from math import sqrt 2 | from numpy import concatenate 3 | from matplotlib import pyplot 4 | import pandas as pd 5 | from datetime import datetime 6 | from sklearn.preprocessing import MinMaxScaler 7 | from sklearn.preprocessing import LabelEncoder 8 | from sklearn.metrics import mean_squared_error 9 | from keras.models import Sequential 10 | from keras.layers import Dense 11 | from keras.layers import LSTM 12 | import numpy as np 13 | import datetime 14 | from pytz import timezone 15 | est = timezone('US/Eastern') 16 | 17 | 18 | from twilio.rest import Client 19 | 20 | # Your Account SID from twilio.com/console 21 | account_sid = "*******" 22 | # Your Auth Token from twilio.com/console 23 | auth_token = "*******" 24 | 25 | client = Client(account_sid, auth_token) 26 | 27 | 28 | 29 | data = pd.read_csv("merged_data.csv") 30 | 31 | datag = data[['Price','Sentiment']].groupby(data['Time']).mean() 32 | 33 | from sklearn.preprocessing import MinMaxScaler 34 | values = datag['Price'].values.reshape(-1,1) 35 | sentiment = datag['Sentiment'].values.reshape(-1,1) 36 | values = values.astype('float32') 37 | sentiment = sentiment.astype('float32') 38 | scaler = MinMaxScaler(feature_range=(0, 1)) 39 | scaled = scaler.fit_transform(values) 40 | 41 | train_size = int(len(scaled) * 0.7) 42 | test_size = len(scaled) - train_size 43 | train, test = scaled[0:train_size,:], scaled[train_size:len(scaled),:] 44 | print(len(train), len(test)) 45 | split = train_size 46 | 47 | def create_dataset(dataset, look_back, sentiment, sent=False): 48 | dataX, dataY = [], [] 49 | for i in range(len(dataset) - look_back): 50 | if i >= look_back: 51 | a = dataset[i-look_back:i+1, 0] 52 | a = a.tolist() 53 | if(sent==True): 54 | a.append(sentiment[i].tolist()[0]) 55 | dataX.append(a) 56 | dataY.append(dataset[i + look_back, 0]) 57 | #print(len(dataY)) 58 | return np.array(dataX), np.array(dataY) 59 | 60 | look_back = 2 61 | trainX, trainY = create_dataset(train, look_back, sentiment[0:train_size],sent=True) 62 | testX, testY = create_dataset(test, look_back, sentiment[train_size:len(scaled)], sent=True) 63 | 64 | trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) 65 | testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 66 | 67 | model = Sequential() 68 | model.add(LSTM(100, input_shape=(trainX.shape[1], trainX.shape[2]), return_sequences=True)) 69 | model.add(LSTM(100)) 70 | model.add(Dense(1)) 71 | model.compile(loss='mae', optimizer='adam') 72 | history = model.fit(trainX, trainY, epochs=300, batch_size=100, validation_data=(testX, testY), verbose=0, shuffle=False) 73 | 74 | yhat = model.predict(testX) 75 | 76 | yhat_inverse_sent = scaler.inverse_transform(yhat.reshape(-1, 1)) 77 | testY_inverse_sent = scaler.inverse_transform(testY.reshape(-1, 1)) 78 | 79 | rmse_sent = sqrt(mean_squared_error(testY_inverse_sent, yhat_inverse_sent)) 80 | print('Test RMSE: %.3f' % rmse_sent) 81 | 82 | import MySQLdb 83 | #Enter the values for you database connection 84 | dsn_database = "bitcoin" # e.g. "MySQLdbtest" 85 | dsn_hostname = "173.194.231.244" # e.g.: "mydbinstance.xyz.us-east-1.rds.amazonaws.com" 86 | dsn_port = 3306 # e.g. 3306 87 | dsn_uid = "demo" # e.g. "user1" 88 | dsn_pwd = "qwerty@123" # e.g. "Password123" 89 | 90 | conn = MySQLdb.connect(host=dsn_hostname, port=dsn_port, user=dsn_uid, passwd=dsn_pwd, db=dsn_database) 91 | 92 | cursor=conn.cursor() 93 | 94 | 95 | import queue 96 | import time 97 | 98 | import queue 99 | import matplotlib.pyplot as plt 100 | true_q = queue.Queue() 101 | pred_q = queue.Queue() 102 | ''' 103 | fig = plt.figure() 104 | ax = fig.add_subplot(111) 105 | fig.show() 106 | fig.canvas.draw() 107 | plt.ion() 108 | ''' 109 | 110 | def process_data(in_data): 111 | out_data = [] 112 | for line in in_data: 113 | out_data.append(float(line.split(',')[0])) 114 | return np.array(out_data).reshape(-1,1) 115 | prev = 15000 116 | threshold = 0.05 117 | while True: 118 | btc = open('live_bitcoin.csv','r') 119 | sent = open('live_tweet.csv','r') 120 | bit_data = btc.readlines() 121 | sent_data = sent.readlines() 122 | bit_data = process_data(bit_data[len(bit_data)-5:]) 123 | sent_data = process_data(sent_data[len(sent_data)-5:]) 124 | live = scaler.transform(bit_data) 125 | testX, testY = create_dataset(live, 2, sent_data, sent=True) 126 | testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 127 | yhat = model.predict(testX) 128 | yhat_inverse = scaler.inverse_transform(yhat.reshape(-1, 1)) 129 | true_q.put(bit_data[4]) 130 | pred_q.put(yhat_inverse[0]) 131 | val = 100*((yhat_inverse[0][0] - prev)/prev) 132 | if val > threshold: 133 | decision = 'Buy!!!' 134 | message = client.messages.create(to="+15184234418‬", from_="+15188883052", body=decision+' - Price of Bitcoin is expected to rise.') 135 | elif val <-threshold: 136 | decision = 'Sell!!!' 137 | message = client.messages.create(to="+15184234418", from_="+15188883052", body=decision+' - Price of Bitcoin is expected to drop.') 138 | else: 139 | decision = '' 140 | prev = yhat_inverse[0][0] 141 | input_string = "INSERT INTO live_data values ({},{},{},'{}','{}');".format(yhat_inverse[0][0],bit_data[0][0],sent_data[4][0],datetime.datetime.now(tz=est).strftime('%Y-%m-%d %H:%M:%S'),decision) 142 | cursor.execute(input_string) 143 | conn.commit() 144 | time.sleep(60) 145 | 146 | 147 | 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /future_virtual_trading.py: -------------------------------------------------------------------------------- 1 | from math import sqrt 2 | from numpy import concatenate 3 | from matplotlib import pyplot 4 | import pandas as pd 5 | from datetime import datetime 6 | from sklearn.preprocessing import MinMaxScaler 7 | from sklearn.preprocessing import LabelEncoder 8 | from sklearn.metrics import mean_squared_error 9 | from keras.models import Sequential 10 | from keras.layers import Dense 11 | from keras.layers import LSTM 12 | import numpy as np 13 | import datetime 14 | from pytz import timezone 15 | est = timezone('US/Eastern') 16 | 17 | 18 | from twilio.rest import Client 19 | 20 | # Your Account SID from twilio.com/console 21 | account_sid = "AC3899557667afcb2bbc20e9ebecf8befb" 22 | # Your Auth Token from twilio.com/console 23 | auth_token = "18c9c35bafb8abb1c009e9aad25a0aec" 24 | 25 | client = Client(account_sid, auth_token) 26 | 27 | 28 | 29 | data = pd.read_csv("merged_data.csv") 30 | 31 | datag = data[['Price','Sentiment']].groupby(data['Time']).mean() 32 | 33 | from sklearn.preprocessing import MinMaxScaler 34 | values = datag['Price'].values.reshape(-1,1) 35 | sentiment = datag['Sentiment'].values.reshape(-1,1) 36 | values = values.astype('float32') 37 | sentiment = sentiment.astype('float32') 38 | scaler = MinMaxScaler(feature_range=(0, 1)) 39 | scaled = scaler.fit_transform(values) 40 | 41 | train_size = int(len(scaled) * 0.7) 42 | test_size = len(scaled) - train_size 43 | train, test = scaled[0:train_size,:], scaled[train_size:len(scaled),:] 44 | print(len(train), len(test)) 45 | split = train_size 46 | 47 | def create_dataset(dataset, look_back, sentiment, sent=False): 48 | dataX, dataY = [], [] 49 | for i in range(len(dataset) - look_back): 50 | if i >= look_back: 51 | a = dataset[i-look_back:i+1, 0] 52 | a = a.tolist() 53 | if(sent==True): 54 | a.append(sentiment[i].tolist()[0]) 55 | dataX.append(a) 56 | dataY.append(dataset[i + look_back, 0]) 57 | #print(len(dataY)) 58 | return np.array(dataX), np.array(dataY) 59 | 60 | look_back = 2 61 | trainX, trainY = create_dataset(train, look_back, sentiment[0:train_size],sent=True) 62 | testX, testY = create_dataset(test, look_back, sentiment[train_size:len(scaled)], sent=True) 63 | 64 | trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) 65 | testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 66 | 67 | model = Sequential() 68 | model.add(LSTM(100, input_shape=(trainX.shape[1], trainX.shape[2]), return_sequences=True)) 69 | model.add(LSTM(100)) 70 | model.add(Dense(1)) 71 | model.compile(loss='mae', optimizer='adam') 72 | history = model.fit(trainX, trainY, epochs=300, batch_size=100, validation_data=(testX, testY), verbose=0, shuffle=False) 73 | 74 | yhat = model.predict(testX) 75 | 76 | yhat_inverse_sent = scaler.inverse_transform(yhat.reshape(-1, 1)) 77 | testY_inverse_sent = scaler.inverse_transform(testY.reshape(-1, 1)) 78 | 79 | rmse_sent = sqrt(mean_squared_error(testY_inverse_sent, yhat_inverse_sent)) 80 | print('Test RMSE: %.3f' % rmse_sent) 81 | 82 | import MySQLdb 83 | #Enter the values for you database connection 84 | dsn_database = "bitcoin" # e.g. "MySQLdbtest" 85 | dsn_hostname = "173.194.231.244" # e.g.: "mydbinstance.xyz.us-east-1.rds.amazonaws.com" 86 | dsn_port = 3306 # e.g. 3306 87 | dsn_uid = "demo" # e.g. "user1" 88 | dsn_pwd = "qwerty@123" # e.g. "Password123" 89 | 90 | conn = MySQLdb.connect(host=dsn_hostname, port=dsn_port, user=dsn_uid, passwd=dsn_pwd, db=dsn_database) 91 | 92 | cursor=conn.cursor() 93 | 94 | 95 | import queue 96 | import time 97 | 98 | import queue 99 | import matplotlib.pyplot as plt 100 | true_q = queue.Queue() 101 | pred_q = queue.Queue() 102 | ''' 103 | fig = plt.figure() 104 | ax = fig.add_subplot(111) 105 | fig.show() 106 | fig.canvas.draw() 107 | plt.ion() 108 | ''' 109 | 110 | def process_data(in_data): 111 | out_data = [] 112 | for line in in_data: 113 | out_data.append(float(line.split(',')[0])) 114 | return np.array(out_data).reshape(-1,1) 115 | prev = 15000 116 | threshold = 0.05 117 | bank = 15000 118 | bitcoin = 0 119 | while True: 120 | btc = open('live_bitcoin.csv','r') 121 | sent = open('live_tweet.csv','r') 122 | bit_data = btc.readlines() 123 | sent_data = sent.readlines() 124 | bit_data = process_data(bit_data[len(bit_data)-5:]) 125 | sent_data = process_data(sent_data[len(sent_data)-5:]) 126 | live = scaler.transform(bit_data) 127 | testX, testY = create_dataset(live, 2, sent_data, sent=True) 128 | testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 129 | yhat = model.predict(testX) 130 | yhat_inverse = scaler.inverse_transform(yhat.reshape(-1, 1)) 131 | true_q.put(bit_data[4]) 132 | pred_q.put(yhat_inverse[0]) 133 | val = 100*((yhat_inverse[0][0] - prev)/prev) 134 | if val > threshold: 135 | decision = 'Buy!!!' 136 | #message = client.messages.create(to="+15184234418‬", from_="+15188883052", body=decision+' - Price of Bitcoin is expected to rise.') 137 | elif val <-threshold: 138 | decision = 'Sell!!!' 139 | #message = client.messages.create(to="+15184234418", from_="+15188883052", body=decision+' - Price of Bitcoin is expected to drop.') 140 | else: 141 | decision = '' 142 | prev = yhat_inverse[0][0] 143 | #input_string = "INSERT INTO live_data values ({},{},{},'{}','{}');".format(yhat_inverse[0][0],bit_data[0][0],sent_data[4][0],datetime.datetime.now(tz=est).strftime('%Y-%m-%d %H:%M:%S'),decision) 144 | #cursor.execute(input_string) 145 | #conn.commit() 146 | time.sleep(60) 147 | 148 | 149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /get_bitcoin_new.py: -------------------------------------------------------------------------------- 1 | import requests, json 2 | from time import sleep 3 | from datetime import datetime 4 | import sys 5 | import traceback 6 | import argparse 7 | 8 | parser = argparse.ArgumentParser() 9 | 10 | parser.add_argument("outputfile", nargs='?', default="bitcoin_price.json") 11 | parser.add_argument("errorfile", nargs='?', default="bitcoin_price_error.txt") 12 | args = parser.parse_args() 13 | 14 | def getBitcoinPrice(): 15 | URL = 'https://www.bitstamp.net/api/ticker/' 16 | try: 17 | r = requests.get(URL) 18 | bitcoindata = json.loads(r.text) 19 | bitcoindata['datetime'] = datetime.utcfromtimestamp(int(bitcoindata['timestamp'])).strftime('%Y-%m-%d-%H-%M-%S') 20 | 21 | with open(args.outputfile, mode='a') as file: 22 | file.write('{},\n'.format(json.dumps(bitcoindata))) 23 | 24 | except: 25 | exc_type, exc_value, exc_traceback = sys.exc_info() 26 | with open(args.errorfile, mode='a') as file: 27 | traceback.print_exc(file=file) 28 | file.write(('-'*100)+'\n\n') 29 | 30 | 31 | while True: 32 | getBitcoinPrice() 33 | sleep(10) -------------------------------------------------------------------------------- /get_bitcoin_price.py: -------------------------------------------------------------------------------- 1 | __author__ = 'Chandra S Narain Kappera' 2 | 3 | import requests 4 | 5 | def getPrices(): 6 | date_prices = {} 7 | for page in range(1,1000): 8 | page_string = str(page) 9 | page_link = 'https://api.coinbase.com/v1/prices/historical?page=' + page_string 10 | r = requests.get(page_link) 11 | r = r.text 12 | year_string = r[0:4] 13 | month_string = r[5:7] 14 | day_string = r[8:10] 15 | year_int = int(year_string) 16 | month_int = int(month_string) 17 | day_int = int(day_string) 18 | date_tuple = (year_int, month_int, day_int) 19 | if date_tuple not in date_prices: 20 | date_string = year_string + "-" + month_string + "-" + day_string 21 | start_point = r.index(date_string) + 26 22 | end_point = start_point 23 | while r[end_point] != '.': 24 | end_point = end_point + 1 25 | end_point = end_point + 2 26 | value_string = r[start_point:end_point] 27 | value_float = float(value_string) 28 | date_prices[date_tuple] = value_float 29 | day_on_page = True 30 | while day_on_page: 31 | if month_int == 3 and day_int == 1: 32 | month_int = 2 33 | day_int = 28 34 | elif (month_int == 5 or month_int == 7 or month_int == 10 or month_int == 12) and day_int == 1: 35 | month_int = month_int - 1 36 | day_int = 30 37 | elif (month_int == 2 or month_int == 4 or month_int == 6 or month_int == 8 or month_int == 9 or month_int == 11) and day_int == 1: 38 | month_int = month_int - 1 39 | day_int = 31 40 | elif month_int == 1 and day_int == 1: 41 | month_int = 12 42 | day_int = 31 43 | year_int = year_int - 1 44 | else: 45 | day_int = day_int - 1 46 | month_string = str(month_int) 47 | if len(month_string) < 2: 48 | month_string = '0' + month_string 49 | day_string = str(day_int) 50 | if len(day_string) < 2: 51 | day_string = '0' + day_string 52 | date_string = str(year_int) + '-' + month_string + '-' + day_string 53 | if r.find(date_string) == -1: 54 | day_on_page = False 55 | break 56 | start_point = r.index(date_string) + 26 57 | end_point = start_point 58 | while r[end_point] != '.': 59 | end_point = end_point + 1 60 | end_point = end_point + 2 61 | value_string = r[start_point:end_point] 62 | value_float = float(value_string) 63 | date_tuple = (year_int, month_int, day_int) 64 | date_prices[date_tuple] = value_float 65 | return date_prices 66 | 67 | 68 | #figure out first day in list 69 | #if we don't have data for that day 70 | #get data 71 | #otherwise 72 | #find next day's data 73 | #add day to days list 74 | #if we can't find next day's data 75 | #next page 76 | 77 | 78 | target = open('bitcoinprices.txt', 'w') 79 | 80 | price_dict = getPrices() 81 | # not very elegant - need to modify this, but commiting the current logic - Chandra 82 | for key in price_dict.keys(): 83 | year = key[0] 84 | month = key[1] 85 | date = key[2] 86 | year = year*10000 87 | month = month*100 88 | stamp = year+month+date 89 | value = price_dict[key] 90 | target.write(str(stamp)+','+str(value)+'\n') 91 | -------------------------------------------------------------------------------- /get_twitter.py: -------------------------------------------------------------------------------- 1 | __author__ = 'Chandra S Narain Kappera' 2 | 3 | 4 | from pprint import pprint 5 | import requests, json 6 | import selenium 7 | from selenium import webdriver 8 | from selenium.webdriver.common.by import By 9 | from selenium.webdriver.support.ui import WebDriverWait 10 | from selenium.webdriver.support import expected_conditions as EC 11 | import time 12 | import datetime 13 | 14 | 15 | #Format 16 | #{"importance": 0-10, "sentiment": positive/negative/neutral, "score":0-1} 17 | # 18 | 19 | def get_sentiment(year, month, day): 20 | month_string = str(month) 21 | if len(month_string) < 2: 22 | month_string = "0" + month_string 23 | day_string = str(day) 24 | if len(day_string) < 2: 25 | day_string = "0" + day_string 26 | date = str(year) + month_string + day_string 27 | 28 | r1 = requests.get("http://archive.org/wayback/available?url=reddit.com/r/bitcoin×tamp=" + date) 29 | 30 | if(r1.status_code == 200): 31 | data1 = json.loads(r1.text) 32 | archive_url = data1['archived_snapshots']['closest']['url'] 33 | else: 34 | archive_url = None 35 | print("Error return code = "+str(r1.status_code)) 36 | 37 | r2 = requests.get("https://api.idolondemand.com/1/api/sync/analyzesentiment/v1?apikey=fe6dea49-084f-4cd8-be86-0976baf9a714&url=" + archive_url) 38 | 39 | if(r2.status_code == 200): 40 | data2 = json.loads(r2.text) 41 | return data2['aggregate']['score'] 42 | else: 43 | print("Error return code = "+str(r2.status_code)) 44 | 45 | 46 | def make_dict(): 47 | scores = {} 48 | date = datetime.date(2017, 11, 14) 49 | target = open('sentiment6.txt', 'w') 50 | for i in range(643): 51 | #print(date.year) 52 | #print(date.month) 53 | #print(date.day) 54 | stamp = date.year*10000+date.month*100+date.day 55 | value = get_sentiment(date.year, date.month, date.day) 56 | scores[(date.year, date.month, date.day)] = value 57 | date -= datetime.timedelta(days=1) 58 | target.write(str(stamp)+','+str(value)) 59 | target.write('\n') 60 | target.close() 61 | make_dict() 62 | -------------------------------------------------------------------------------- /get_twitter_new.py: -------------------------------------------------------------------------------- 1 | #Import the necessary methods from tweepy library 2 | from tweepy.streaming import StreamListener 3 | from tweepy import OAuthHandler 4 | from tweepy import Stream 5 | from textblob import TextBlob 6 | import re 7 | import json 8 | import datetime 9 | import traceback 10 | import sys 11 | 12 | import argparse 13 | 14 | parser = argparse.ArgumentParser() 15 | 16 | parser.add_argument("outputfile", nargs='?', default="tweets_bitcoin.json") 17 | parser.add_argument("errorfile", nargs='?', default="tweets_bitcoin_error.txt") 18 | 19 | 20 | args = parser.parse_args() 21 | 22 | #Variables that contains the user credentials to access Twitter API 23 | access_token = "2569501620-dOSDk5kftHZiOTlWDzu66k9S7xKEh2GrpjNn1SA" 24 | access_token_secret = "makKH9EdIErBW8JhQdHdc594qWyH09VoQkZm4FFCAHCQk" 25 | consumer_key = "VZ4evnFfxQ0f1vyRpyoJrf5VT" 26 | consumer_secret = "dcSDKuSz0ODD8kqPgBdBX6u6l0JoGq8NDbGQ2Vvg5bukDo3weh" 27 | 28 | 29 | class Tweet: 30 | def __init__(self, text, sentiment_text, polarity, created_at): 31 | self.text = text 32 | self.sentiment_text = sentiment_text 33 | self.polarity = polarity 34 | self.created_at = created_at 35 | 36 | def __str__(self): 37 | return 'Sentiment: {} {} \nText: {}\nCreated_At: {}\n'.format(self.sentiment_text, self.polarity, self.text, self.created_at) 38 | 39 | #This is a basic listener that just prints received tweets to stdout. 40 | class StdOutListener(StreamListener): 41 | def __init__(self): 42 | self.mylist = [] 43 | def on_data(self, data): 44 | 45 | tweet = json.loads(data) 46 | 47 | try: 48 | if 'retweeted_status' in tweet: 49 | # Retweets 50 | if 'extended_tweet' in tweet['retweeted_status']: 51 | #When extended beyond 140 Characters limit 52 | tweet_text = tweet['retweeted_status']['extended_tweet']['full_text'] 53 | else: 54 | tweet_text = tweet['retweeted_status']['text'] 55 | else: 56 | #Normal Tweets 57 | if 'extended_tweet' in tweet: 58 | #When extended beyond 140 Characters limit 59 | tweet_text = tweet['extended_tweet']['full_text'] 60 | else: 61 | tweet_text = tweet['text'] 62 | 63 | tweet_sentiment, polarity = self.get_tweet_sentiment(tweet_text) 64 | 65 | newTweetObj = Tweet(text=tweet_text, 66 | sentiment_text=tweet_sentiment, 67 | polarity=polarity, 68 | created_at= datetime.datetime.strptime(tweet['created_at'],'%a %b %d %H:%M:%S %z %Y').strftime('%Y-%m-%d-%H-%M-%S')) 69 | 70 | with open(args.outputfile, mode='a') as file: 71 | file.write('{},\n'.format(json.dumps(newTweetObj.__dict__))) 72 | 73 | except: 74 | exc_type, exc_value, exc_traceback = sys.exc_info() 75 | with open(args.errorfile, mode='a') as file: 76 | file.write('Error: {}\n\nTweet Info: {}\n--------------------------\n'.format(repr(traceback.format_tb(exc_traceback)), tweet)) 77 | 78 | return True 79 | 80 | def on_error(self, status): 81 | print(status) 82 | print('-----------------') 83 | 84 | def clean_tweet(self, tweet): 85 | ''' 86 | Utility function to clean tweet text by removing links, special characters 87 | using simple regex statements. 88 | ''' 89 | return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split()) 90 | 91 | def get_tweet_sentiment(self, tweet): 92 | ''' 93 | Utility function to classify sentiment of passed tweet 94 | using textblob's sentiment method 95 | ''' 96 | # create TextBlob object of passed tweet text 97 | analysis = TextBlob(self.clean_tweet(tweet)) 98 | 99 | # set sentiment 100 | sentiment = None 101 | if analysis.sentiment.polarity > 0: 102 | sentiment = 'positive' 103 | elif analysis.sentiment.polarity == 0: 104 | sentiment = 'neutral' 105 | else: 106 | sentiment = 'negative' 107 | 108 | return sentiment, analysis.sentiment.polarity 109 | 110 | def convert_sentiment_to_emoticon(self, sentiment_text): 111 | if sentiment_text == 'positive': 112 | return '✅' 113 | elif sentiment_text == 'negative': 114 | return '❌' 115 | else: 116 | return '🤷' 117 | 118 | if __name__ == '__main__': 119 | 120 | #This handles Twitter authetification and the connection to Twitter Streaming API 121 | l = StdOutListener() 122 | auth = OAuthHandler(consumer_key, consumer_secret) 123 | auth.set_access_token(access_token, access_token_secret) 124 | stream = Stream(auth, l, tweet_mode='extended') 125 | 126 | #This line filter Twitter Streams to capture data by the keywords: 'python', 'javascript', 'ruby' 127 | stream.filter(track=['bitcoin', 'BTC']) -------------------------------------------------------------------------------- /sentiment6.txt: -------------------------------------------------------------------------------- 1 | 20171114,0.38021943904690936 2 | 20171113,0.38021943904690936 3 | 20171112,0.38021943904690936 4 | 20171111,0.38021943904690936 5 | 20171110,0.38021943904690936 6 | 20171109,0.38021943904690936 7 | 20171108,0.38021943904690936 8 | 20171107,0.38021943904690936 9 | 20171106,0.38021943904690936 10 | 20171105,0.38021943904690936 11 | 20171104,0.38021943904690936 12 | 20171103,0.38021943904690936 13 | 20171102,0.38021943904690936 14 | 20171101,0.38021943904690936 15 | 20171031,0.38021943904690936 16 | 20171030,0.38021943904690936 17 | 20171029,0.38021943904690936 18 | 20171028,0.38021943904690936 19 | 20171027,0.38021943904690936 20 | 20171026,0.38021943904690936 21 | 20171025,0.38021943904690936 22 | 20171024,0.38021943904690936 23 | 20171023,0.38021943904690936 24 | 20171022,0.38021943904690936 25 | 20171021,0.38021943904690936 26 | 20171020,0.38021943904690936 27 | 20171019,0.38021943904690936 28 | 20171018,0.38021943904690936 29 | 20171017,0.38021943904690936 30 | 20171016,0.38021943904690936 31 | 20171015,0.38021943904690936 32 | 20171014,0.38021943904690936 33 | 20171013,0.38021943904690936 34 | 20171012,0.38021943904690936 35 | 20171011,0.38021943904690936 36 | 20171010,0.38021943904690936 37 | 20171009,0.38021943904690936 38 | 20171008,0.38021943904690936 39 | 20171007,0.38021943904690936 40 | 20171006,0.38021943904690936 41 | 20171005,0.38021943904690936 42 | 20171004,0.38021943904690936 43 | 20171003,0.38021943904690936 44 | 20171002,0.2505911694572912 45 | 20171001,0.2883043981056517 46 | 20170930,0.22871109056917982 47 | 20170929,0.3806278258579074 48 | 20170928,0.24809526009512026 49 | 20170927,0.2625429079708684 50 | 20170926,0.2625429079708684 51 | 20170925,0.347151782235405 52 | 20170924,0.3069042819449387 53 | 20170923,0.22740568414417128 54 | 20170922,0.07673560909897316 55 | 20170921,0.318641544217865 56 | 20170920,0.318641544217865 57 | 20170919,0.1980971309285184 58 | 20170918,0.3049536211823958 59 | 20170917,0.292749113295036 60 | 20170916,0.2596776886772127 61 | 20170915,0.25284511111632846 62 | 20170914,0.09739457147044052 63 | 20170913,0.16079828706521007 64 | 20170912,0.25591845918058764 65 | 20170911,0.3467723630228228 66 | 20170910,0.2917620893733621 67 | 20170909,0.3370602849342434 68 | 20170908,0.11018949237374867 69 | 20170907,0.24013439101853573 70 | 20170906,0.17587381606832045 71 | 20170905,0.2585821529543866 72 | 20170904,0.3363159213279587 73 | 20170903,0.3452091436650593 74 | 20170902,0.410246838560282 75 | 20170901,0.34961641313783115 76 | 20170831,0.371981770591173 77 | 20170830,0.25394288550817595 78 | 20170829,0.21874676944921964 79 | 20170828,0.21874676944921964 80 | 20170827,0.3598057072808753 81 | 20170826,0.26887507826993684 82 | 20170825,0.22403883946656988 83 | 20170824,0.16035248567793672 84 | 20170823,0.18468143537746343 85 | 20170822,0.3523245671300772 86 | 20170821,0.3151493556819943 87 | 20170820,0.10876035749010954 88 | 20170819,0.27383642364593547 89 | 20170818,0.2287504066057202 90 | 20170817,0.29796878488148787 91 | 20170816,0.152765307186486 92 | 20170815,0.15091089305019034 93 | 20170814,0.30374067910015107 94 | 20170813,0.37456593042579167 95 | 20170812,0.34140746243192505 96 | 20170811,0.3758329745600802 97 | 20170810,0.243127877976264 98 | 20170809,0.16266069617076145 99 | 20170808,0.3751261826692668 100 | 20170807,0.3620419192525838 101 | 20170806,0.4232222785640444 102 | 20170805,0.03370941542788476 103 | 20170804,0.2959419357690376 104 | 20170803,0.43510436996532165 105 | 20170802,0.5045077403204518 106 | 20170801,0.38579380415996084 107 | 20170731,0.20538887673196699 108 | 20170730,0.20538887673196699 109 | 20170729,0.21995154183116494 110 | 20170728,0.2540792928216312 111 | 20170727,0.2800075998644351 112 | 20170726,0.29979533674737996 113 | 20170725,0.1149573421446629 114 | 20170724,0.5002746636988847 115 | 20170723,0.43108252354295723 116 | 20170722,0.2777090506131157 117 | 20170721,0.4854968579086719 118 | 20170720,0.3376769740993703 119 | 20170719,0.25877486715415804 120 | 20170718,0.39237710237276197 121 | 20170717,0.4685222099196068 122 | 20170716,0.3360522452634446 123 | 20170715,0.12597394868986372 124 | 20170714,0.4542367943161525 125 | 20170713,0.15406235227181583 126 | 20170712,0.29094835438614375 127 | 20170711,0.38862384789905235 128 | 20170710,0.510614340603299 129 | 20170709,0.510614340603299 130 | 20170708,0.21502846353920602 131 | 20170707,0.41530443718718674 132 | 20170706,0.3480927641863872 133 | 20170705,0.18694484779031673 134 | 20170704,0.09310500971278221 135 | 20170703,0.0669665313504003 136 | 20170702,0.18882317328969558 137 | 20170701,0.29059122537644677 138 | 20170630,0.2683340719507728 139 | 20170629,0.2703343362665517 140 | 20170628,0.11723817518397327 141 | 20170627,0.17665150748971625 142 | 20170626,0.27715151044653025 143 | 20170625,0.21685749726903347 144 | 20170624,0.31850331612785815 145 | 20170623,0.30021087154094567 146 | 20170622,0.3063278445266835 147 | 20170621,0.18945601707829474 148 | 20170620,0.15540824256029975 149 | 20170619,0.35493137474853276 150 | 20170618,0.3774529849124963 151 | 20170617,0.1677529919427456 152 | 20170616,0.1677529919427456 153 | 20170615,0.24729676184854765 154 | 20170614,0.1485524891552037 155 | 20170613,-0.040371922823996126 156 | 20170612,0.2635892723228725 157 | 20170611,0.3833741890425256 158 | 20170610,0.383941440827027 159 | 20170609,0.1026646062635423 160 | 20170608,0.1778802234480251 161 | 20170607,0.37726742269057745 162 | 20170606,0.17640603920465855 163 | 20170605,0.308088085615714 164 | 20170604,0.22873950096075696 165 | 20170603,0.31959951414354215 166 | 20170602,0.24101319963498843 167 | 20170601,0.17012411429790877 168 | 20170531,0.07014599143180046 169 | 20170530,0.2120864947064709 170 | 20170529,0.2120864947064709 171 | 20170528,0.24970388274243369 172 | 20170527,0.21238023410492496 173 | 20170526,0.4586725585380068 174 | 20170525,0.3496578489114199 175 | 20170524,0.2657564279634523 176 | 20170523,0.4040768133626713 177 | 20170522,0.17056525325442085 178 | 20170521,0.3477333770707802 179 | 20170520,0.3871956140364719 180 | 20170519,0.27137216552019106 181 | 20170518,0.16802333077423814 182 | 20170517,0.3408091753367907 183 | 20170516,0.09615415156119812 184 | 20170515,0.3166774104506486 185 | 20170514,0.3166774104506486 186 | 20170513,0.19639805699271165 187 | 20170512,0.44894053321408467 188 | 20170511,0.3571365450558292 189 | 20170510,0.09300275107338975 190 | 20170509,0.4622597164277392 191 | 20170508,0.48518585161221944 192 | 20170507,0.26710718852102594 193 | 20170506,0.3301874089233446 194 | 20170505,0.4239203443238371 195 | 20170504,0.19717928195127438 196 | 20170503,0.3043593035203883 197 | 20170502,0.258361727843722 198 | 20170501,0.1548289066240211 199 | 20170430,0.12990744579958433 200 | 20170429,0.22800852108652264 201 | 20170428,0.2488288819297634 202 | 20170427,0.11637409389031098 203 | 20170426,0.21643355160391808 204 | 20170425,0.23901394017001873 205 | 20170424,0.3199119640299874 206 | 20170423,0.3832959983080909 207 | 20170422,0.4756622159477592 208 | 20170421,0.3326870202884664 209 | 20170420,0.113556894177197 210 | 20170419,0.08850622377644807 211 | 20170418,0.31039919383459413 212 | 20170417,0.32015354816417074 213 | 20170416,0.2668320514746584 214 | 20170415,0.3146846905800985 215 | 20170414,0.18776066278887835 216 | 20170413,0.3861244497759137 217 | 20170412,0.3245588418385859 218 | 20170411,0.2706404838308102 219 | 20170410,0.05208776327594738 220 | 20170409,0.14081391368435534 221 | 20170408,0.018005442837751316 222 | 20170407,0.10197464411414206 223 | 20170406,0.21070069051355553 224 | 20170405,0.31689766946821524 225 | 20170404,0.3130415263684466 226 | 20170403,0.2937196950891288 227 | 20170402,0.2020168499160209 228 | 20170401,0.347791460207737 229 | 20170331,0.1933171620404274 230 | 20170330,0.1280023859962342 231 | 20170329,0.20834956976157623 232 | 20170328,0.08202415035239306 233 | 20170327,0.19121891274857855 234 | 20170326,0.33775771723697706 235 | 20170325,0.16654225656105356 236 | 20170324,0.3380867839375403 237 | 20170323,0.02211859305684538 238 | 20170322,0.2976134405851208 239 | 20170321,0.14764289040277032 240 | 20170320,0.25813452009376425 241 | 20170319,0.33426197666399865 242 | 20170318,0.17964069971106156 243 | 20170317,0.38572162832908496 244 | 20170316,0.16859617964154316 245 | 20170315,0.34317467076191693 246 | 20170314,0.20229882288975878 247 | 20170313,0.09448256062329684 248 | 20170312,0.18984718710618875 249 | 20170311,0.3022397051171501 250 | 20170310,0.2936294101724601 251 | 20170309,0.3733741706581603 252 | 20170308,0.25024096164196835 253 | 20170307,0.3941018610733407 254 | 20170306,0.3542635100549983 255 | 20170305,0.2789727409736776 256 | 20170304,0.3314061861830554 257 | 20170303,0.3164806095850169 258 | 20170302,0.28878392460718255 259 | 20170301,0.40588685047251355 260 | 20170228,0.28341045287698624 261 | 20170227,0.3367314636743158 262 | 20170226,0.22406379250486005 263 | 20170225,0.30071073432284867 264 | 20170224,0.3099757475965949 265 | 20170223,0.32129743094466207 266 | 20170222,0.34275875923163224 267 | 20170221,0.30195474875529793 268 | 20170220,0.180401339140928 269 | 20170219,0.31327113422582126 270 | 20170218,0.2723475484402832 271 | 20170217,0.3801157651513554 272 | 20170216,0.24271048363100944 273 | 20170215,0.2244451215373433 274 | 20170214,0.3924237636474582 275 | 20170213,0.4404530729518508 276 | 20170212,0.2884606042943219 277 | 20170211,0.36334298682595995 278 | 20170210,0.31825489902703885 279 | 20170209,0.30814201443544653 280 | 20170208,0.3363796866351565 281 | 20170207,0.246464174660013 282 | 20170206,0.28548048700214934 283 | 20170205,0.37650587135258096 284 | 20170204,0.3380776867872938 285 | 20170203,0 286 | 20170202,0 287 | 20170201,0.39827594800090765 288 | 20170131,0.07155334251923583 289 | 20170130,0.22133041873843623 290 | 20170129,0.28767802714622037 291 | 20170128,0.38002948093755384 292 | 20170127,0.288970847040402 293 | 20170126,0.39624662982350156 294 | 20170125,0.24827846182889104 295 | 20170124,0.18583339211594546 296 | 20170123,0.34650153809464296 297 | 20170122,0.4650471322880682 298 | 20170121,0.4549192867376071 299 | 20170120,0.2981663638620774 300 | 20170119,0.22691515539686366 301 | 20170118,0.44305754264078745 302 | 20170117,0.30475499376618664 303 | 20170116,0.34536157379325333 304 | 20170115,0.29702551851818665 305 | 20170114,0.30380038488592304 306 | 20170113,0.25818400423533855 307 | 20170112,0.3930190926850269 308 | 20170111,0.27800254733237345 309 | 20170110,0.39870320162901374 310 | 20170109,0.4312088404650657 311 | 20170108,0.32130783266007645 312 | 20170107,0.3048873987910217 313 | 20170106,0.4691977309069293 314 | 20170105,0.4691977309069293 315 | 20170104,0.4691977309069293 316 | 20170103,0.37969648057585376 317 | 20170102,0.37969648057585376 318 | 20170101,0.37969648057585376 319 | 20161231,0.3575934832883298 320 | 20161230,0.3575934832883298 321 | 20161229,0.3575934832883298 322 | 20161228,0.3575934832883298 323 | 20161227,0.39987223183786164 324 | 20161226,0.39987223183786164 325 | 20161225,0.39987223183786164 326 | 20161224,0.4277726025271001 327 | 20161223,0.4277726025271001 328 | 20161222,0.4277726025271001 329 | 20161221,0.2816483590386045 330 | 20161220,0.2816483590386045 331 | 20161219,0.2816483590386045 332 | 20161218,0.2816483590386045 333 | 20161217,0.2816483590386045 334 | 20161216,0.3796936736131927 335 | 20161215,0.3796936736131927 336 | 20161214,0.3796936736131927 337 | 20161213,0.3796936736131927 338 | 20161212,0.3796936736131927 339 | 20161211,0.3796936736131927 340 | 20161210,0.3796936736131927 341 | 20161209,0.43782319004576975 342 | 20161208,0.43782319004576975 343 | 20161207,0.43782319004576975 344 | 20161206,0.43782319004576975 345 | 20161205,0.43782319004576975 346 | 20161204,0.43782319004576975 347 | 20161203,0.43782319004576975 348 | 20161202,0.29379326196655037 349 | 20161201,0.29379326196655037 350 | 20161130,0.29379326196655037 351 | 20161129,0.29379326196655037 352 | 20161128,0.29379326196655037 353 | 20161127,0.29379326196655037 354 | 20161126,0.35271100358911633 355 | 20161125,0.35271100358911633 356 | 20161124,0.35271100358911633 357 | 20161123,0.35271100358911633 358 | 20161122,0.35271100358911633 359 | 20161121,0.35271100358911633 360 | 20161120,0.3579517383343933 361 | 20161119,0.3579517383343933 362 | 20161118,0.3579517383343933 363 | 20161117,0.3579517383343933 364 | 20161116,0.3579517383343933 365 | 20161115,0.3579517383343933 366 | 20161114,0.3815485566088281 367 | 20161113,0.3815485566088281 368 | 20161112,0.3815485566088281 369 | 20161111,0.3815485566088281 370 | 20161110,0.4243532163835117 371 | 20161109,0.4243532163835117 372 | 20161108,0.4243532163835117 373 | 20161107,0.4243532163835117 374 | 20161106,0.4243532163835117 375 | 20161105,0.4243532163835117 376 | 20161104,0.37459906884480104 377 | 20161103,0.37459906884480104 378 | 20161102,0.37459906884480104 379 | 20161101,0.37459906884480104 380 | 20161031,0.42351258674997966 381 | 20161030,0.42351258674997966 382 | 20161029,0.42351258674997966 383 | 20161028,0.26480713905437514 384 | 20161027,0.26480713905437514 385 | 20161026,0.42814055674111173 386 | 20161025,0.3444665708146327 387 | 20161024,0.3444665708146327 388 | 20161023,0.3444665708146327 389 | 20161022,0.3444665708146327 390 | 20161021,0.3444665708146327 391 | 20161020,0.3632954194498043 392 | 20161019,0.3632954194498043 393 | 20161018,0.3632954194498043 394 | 20161017,0.45439791338417085 395 | 20161016,0.45439791338417085 396 | 20161015,0.2645992256385194 397 | 20161014,0.2645992256385194 398 | 20161013,0.2645992256385194 399 | 20161012,0.2645992256385194 400 | 20161011,0.231493274256136 401 | 20161010,0.231493274256136 402 | 20161009,0.231493274256136 403 | 20161008,0.231493274256136 404 | 20161007,0.4181447658397086 405 | 20161006,0.4181447658397086 406 | 20161005,0.4181447658397086 407 | 20161004,0.4181447658397086 408 | 20161003,0.39236930003947107 409 | 20161002,0.39236930003947107 410 | 20161001,0.39236930003947107 411 | 20160930,0.39236930003947107 412 | 20160929,0.39236930003947107 413 | 20160928,0.39236930003947107 414 | 20160927,0.3667874881555046 415 | 20160926,0.3667874881555046 416 | 20160925,0.3667874881555046 417 | 20160924,0.3667874881555046 418 | 20160923,0.3667874881555046 419 | 20160922,0.3667874881555046 420 | 20160921,0.3667874881555046 421 | 20160920,0.3667874881555046 422 | 20160919,0.41950303467340844 423 | 20160918,0.41950303467340844 424 | 20160917,0.41950303467340844 425 | 20160916,0.41950303467340844 426 | 20160915,0.41950303467340844 427 | 20160914,0.30583876254339193 428 | 20160913,0.30583876254339193 429 | 20160912,0.30583876254339193 430 | 20160911,0.30583876254339193 431 | 20160910,0.30583876254339193 432 | 20160909,0.30583876254339193 433 | 20160908,0.30583876254339193 434 | 20160907,0.30583876254339193 435 | 20160906,0.30583876254339193 436 | 20160905,0.30583876254339193 437 | 20160904,0.27703349209994277 438 | 20160903,0.27703349209994277 439 | 20160902,0.27703349209994277 440 | 20160901,0.27703349209994277 441 | 20160831,0.27703349209994277 442 | 20160830,0.27703349209994277 443 | 20160829,0.27703349209994277 444 | 20160828,0.27703349209994277 445 | 20160827,0.27703349209994277 446 | 20160826,0.27703349209994277 447 | 20160825,0.27703349209994277 448 | 20160824,0.27703349209994277 449 | 20160823,0.27703349209994277 450 | 20160822,0.27703349209994277 451 | 20160821,0.27703349209994277 452 | 20160820,0.27703349209994277 453 | 20160819,0.12397104529288874 454 | 20160818,0.12397104529288874 455 | 20160817,0.12397104529288874 456 | 20160816,0.12397104529288874 457 | 20160815,0.12397104529288874 458 | 20160814,0.12397104529288874 459 | 20160813,0.12397104529288874 460 | 20160812,0.12397104529288874 461 | 20160811,0.12397104529288874 462 | 20160810,0.12397104529288874 463 | 20160809,0.12397104529288874 464 | 20160808,0.12397104529288874 465 | 20160807,0.181541810372209 466 | 20160806,0.181541810372209 467 | 20160805,0.181541810372209 468 | 20160804,0.181541810372209 469 | 20160803,0.183626473495043 470 | 20160802,0.3933434479951281 471 | 20160801,0.19121252355762677 472 | 20160731,0.19121252355762677 473 | 20160730,0.2836800268328441 474 | 20160729,0.2836800268328441 475 | 20160728,0.2814179008072436 476 | 20160727,0.2814179008072436 477 | 20160726,0.3431396276824513 478 | 20160725,0.3431396276824513 479 | 20160724,0.2711219255654779 480 | 20160723,0.2711219255654779 481 | 20160722,0.2711219255654779 482 | 20160721,0.2711219255654779 483 | 20160720,0.2711219255654779 484 | 20160719,0.23900804057476338 485 | 20160718,0.23900804057476338 486 | 20160717,0.23900804057476338 487 | 20160716,0.2786617379853121 488 | 20160715,0.2786617379853121 489 | 20160714,0.2786617379853121 490 | 20160713,0.24593233476051457 491 | 20160712,0.24593233476051457 492 | 20160711,0.24593233476051457 493 | 20160710,0.24593233476051457 494 | 20160709,0.2546622350050327 495 | 20160708,0.2546622350050327 496 | 20160707,0.2546622350050327 497 | 20160706,0.2377765381091954 498 | 20160705,0.1550795454052526 499 | 20160704,0.2543687845687291 500 | 20160703,0.2238612967239434 501 | 20160702,0.2238612967239434 502 | 20160701,0.26863153815701046 503 | 20160630,0.26863153815701046 504 | 20160629,0.26863153815701046 505 | 20160628,0.3602535487769374 506 | 20160627,0.27628626041629173 507 | 20160626,0.27628626041629173 508 | 20160625,0.36405573272179753 509 | 20160624,0.36405573272179753 510 | 20160623,0.3428234880089395 511 | 20160622,0.29220762558609514 512 | 20160621,0.1892551974030994 513 | 20160620,0.1892551974030994 514 | 20160619,0.3540412868518666 515 | 20160618,None 516 | 20160617,0.36513453672807467 517 | 20160616,0.1911184778363609 518 | 20160615,0.1911184778363609 519 | 20160614,0.1911184778363609 520 | 20160613,0.44591831699141976 521 | 20160612,0.44591831699141976 522 | 20160611,0.44591831699141976 523 | 20160610,0.44591831699141976 524 | 20160609,0.44591831699141976 525 | 20160608,0.2633669782783534 526 | 20160607,0.2633669782783534 527 | 20160606,0.2633669782783534 528 | 20160605,0.2633669782783534 529 | 20160604,0.1723816707783527 530 | 20160603,0.1723816707783527 531 | 20160602,0.1723816707783527 532 | 20160601,0.1723816707783527 533 | 20160531,0.3738575063088357 534 | 20160530,0.3738575063088357 535 | 20160529,0.3738575063088357 536 | 20160528,0.3738575063088357 537 | 20160527,0.24549939463680057 538 | 20160526,0.30560050785306075 539 | 20160525,0.30560050785306075 540 | 20160524,0.30560050785306075 541 | 20160523,0.1959593726279536 542 | 20160522,0.1959593726279536 543 | 20160521,0.1959593726279536 544 | 20160520,0.22818581619549058 545 | 20160519,0.22818581619549058 546 | 20160518,0.22818581619549058 547 | 20160517,0.3356428160035545 548 | 20160516,0.3356428160035545 549 | 20160515,0.3356428160035545 550 | 20160514,0.3356428160035545 551 | 20160513,0.45336031366018936 552 | 20160512,0.35878698100300555 553 | 20160511,0.35878698100300555 554 | 20160510,0.35878698100300555 555 | 20160509,0.35878698100300555 556 | 20160508,0.35878698100300555 557 | 20160507,0.29144092102925595 558 | 20160506,0.29144092102925595 559 | 20160505,0.29144092102925595 560 | 20160504,0.29144092102925595 561 | 20160503,0.2561029997281787 562 | 20160502,0.30442258076342743 563 | 20160501,0.30442258076342743 564 | 20160430,0.30442258076342743 565 | 20160429,0.27596816240948013 566 | 20160428,0.27596816240948013 567 | 20160427,0.27596816240948013 568 | 20160426,0.27596816240948013 569 | 20160425,0.27596816240948013 570 | 20160424,0.27596816240948013 571 | 20160423,0.33823057784887334 572 | 20160422,0.33823057784887334 573 | 20160421,0.33823057784887334 574 | 20160420,0.39943268249482516 575 | 20160419,0.4019893026176416 576 | 20160418,0.3760449666982592 577 | 20160417,0.3760449666982592 578 | 20160416,0.3760449666982592 579 | 20160415,0.28413737896522867 580 | 20160414,0.28413737896522867 581 | 20160413,0.28413737896522867 582 | 20160412,0.28413737896522867 583 | 20160411,0.28413737896522867 584 | 20160410,0.5185095039224366 585 | 20160409,0.5185095039224366 586 | 20160408,0.5185095039224366 587 | 20160407,0.24866301703706298 588 | 20160406,0.24866301703706298 589 | 20160405,0.24866301703706298 590 | 20160404,0.24866301703706298 591 | 20160403,0.24866301703706298 592 | 20160402,0.3776666102163249 593 | 20160401,0.3776666102163249 594 | 20160331,0.44691124539982524 595 | 20160330,0.35660893969401114 596 | 20160329,0.36029458182896135 597 | 20160328,0.36029458182896135 598 | 20160327,0.2509085301823485 599 | 20160326,0.2509085301823485 600 | 20160325,0.2509085301823485 601 | 20160324,0.2509085301823485 602 | 20160323,0.29806920588018937 603 | 20160322,0.29806920588018937 604 | 20160321,0.29806920588018937 605 | 20160320,0.2632188453422218 606 | 20160319,0.2632188453422218 607 | 20160318,0.2632188453422218 608 | 20160317,0.2940941216704473 609 | 20160316,0.2940941216704473 610 | 20160315,0.2940941216704473 611 | 20160314,0.2940941216704473 612 | 20160313,0.1675868356079048 613 | 20160312,0.1675868356079048 614 | 20160311,0.1675868356079048 615 | 20160310,0.470822254763685 616 | 20160309,0.470822254763685 617 | 20160308,0.470822254763685 618 | 20160307,0.27763577626939734 619 | 20160306,0.27763577626939734 620 | 20160305,0.30604978887883344 621 | 20160304,0.30604978887883344 622 | 20160303,0.30604978887883344 623 | 20160302,0.34289601025196725 624 | 20160301,0.34289601025196725 625 | 20160229,0.34289601025196725 626 | 20160228,0.456150843448238 627 | 20160227,0.456150843448238 628 | 20160226,0.456150843448238 629 | 20160225,0.456150843448238 630 | 20160224,0.2835236239049316 631 | 20160223,0.2835236239049316 632 | 20160222,0.2910002071019829 633 | 20160221,0.2910002071019829 634 | 20160220,0.2910002071019829 635 | 20160219,0.21771782491281808 636 | 20160218,0.21771782491281808 637 | 20160217,0.32126829533814855 638 | 20160216,0.32126829533814855 639 | 20160215,0.32126829533814855 640 | 20160214,0.30863521159297325 641 | 20160213,0.30490166804054747 642 | 20160212,0.26014177070001776 643 | 20160211,0.3064875485393007 644 | --------------------------------------------------------------------------------