├── .gitignore ├── Backtests ├── SPXTR.csv ├── core_trend.csv ├── counter_trend.csv ├── curve_trading.csv ├── equity_momentum.csv └── time_return.csv ├── Chapter 10 - ETF Models └── ETF Asset Allocation Model.ipynb ├── Chapter 12 - Momentum ├── Expanded Momentum Model.ipynb ├── Graphs.ipynb └── Momentum Model.ipynb ├── Chapter 15 - Futures Trend Following └── TrendModel.ipynb ├── Chapter 16 - Time Return └── TimeReturn.ipynb ├── Chapter 17 - Counter Trend Trading └── Counter Trend Model.ipynb ├── Chapter 18 - Curve Trading └── Curve Trading.ipynb ├── Chapter 20 - Performance Visualization ├── Combined Models.ipynb └── Model Comparison.ipynb ├── Chapter 21- Monkeys ├── Monkey Business.ipynb └── monkeys_random_equal.csv ├── Chapter 22 - Measuring Relative Performance └── Carver - Relative Performance.ipynb ├── Chapter 23 - Importing your Data ├── random_futures_data.py └── random_stock_data.py ├── Chapter 24 - Data and Databases ├── Populating Database.ipynb ├── Querying the Database.ipynb └── database_bundle.py ├── Chapter 5 - Intro ├── Elementary Python.ipynb └── First Python Example.ipynb ├── Chapter 6 Pandas ├── Correlation Graph.ipynb ├── Documentation and Help.ipynb ├── Pandas Intro.ipynb ├── Prettier Plots.ipynb ├── Simple Simulation.ipynb ├── indexes.csv ├── ndx.csv ├── pandas_samples.py ├── sp500.csv └── spy.csv ├── Chapter 7 - Backtesting Trading Strategies ├── First Zipline Backtest.ipynb └── Portfolio Backtest.ipynb ├── Chapter 8 - Analyzing Backtests └── Backtest Analysis.ipynb ├── Chapter 9 - ETF ├── Inverse ETF 2.ipynb ├── Inverse ETF.ipynb ├── Oil ETF.ipynb ├── oil_etf_vs_spot.csv └── short_etfs.csv ├── data └── index_members │ └── sp500.csv └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .ipynb_checkpoints 3 | */.ipynb_checkpoints/* 4 | -------------------------------------------------------------------------------- /Chapter 15 - Futures Trend Following/TrendModel.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "scrolled": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "application/vnd.jupyter.widget-view+json": { 13 | "model_id": "13569da015594ecf926e48d894e94f10", 14 | "version_major": 2, 15 | "version_minor": 0 16 | }, 17 | "text/plain": [ 18 | "HTML(value='')" 19 | ] 20 | }, 21 | "metadata": {}, 22 | "output_type": "display_data" 23 | }, 24 | { 25 | "ename": "SymbolNotFound", 26 | "evalue": "Symbol 'BL' was not found.", 27 | "output_type": "error", 28 | "traceback": [ 29 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 30 | "\u001b[1;31mSymbolNotFound\u001b[0m Traceback (most recent call last)", 31 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 311\u001b[0m \u001b[0mcapital_base\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mstarting_portfolio\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 312\u001b[0m \u001b[0mdata_frequency\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'daily'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 313\u001b[1;33m bundle='rand_fut' ) \n\u001b[0m", 32 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\utils\\run_algo.py\u001b[0m in \u001b[0;36mrun_algorithm\u001b[1;34m(start, end, initialize, capital_base, handle_data, before_trading_start, analyze, data_frequency, data, bundle, bundle_timestamp, trading_calendar, metrics_set, default_extension, extensions, strict_extensions, environ, blotter)\u001b[0m\n\u001b[0;32m 429\u001b[0m \u001b[0mlocal_namespace\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 430\u001b[0m \u001b[0menviron\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0menviron\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 431\u001b[1;33m \u001b[0mblotter\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mblotter\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 432\u001b[0m )\n", 33 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\utils\\run_algo.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(handle_data, initialize, before_trading_start, analyze, algofile, algotext, defines, data_frequency, capital_base, data, bundle, bundle_timestamp, start, end, output, trading_calendar, print_algo, metrics_set, local_namespace, environ, blotter)\u001b[0m\n\u001b[0;32m 228\u001b[0m \u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 229\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 230\u001b[1;33m \u001b[0moverwrite_sim_params\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 231\u001b[0m )\n\u001b[0;32m 232\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, data, overwrite_sim_params)\u001b[0m\n\u001b[0;32m 754\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 755\u001b[0m \u001b[0mperfs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 756\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mperf\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_generator\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 757\u001b[0m \u001b[0mperfs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mperf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 758\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 35 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36mget_generator\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 627\u001b[0m \u001b[0mmethod\u001b[0m \u001b[0mto\u001b[0m \u001b[0mget\u001b[0m \u001b[0ma\u001b[0m \u001b[0mstandard\u001b[0m \u001b[0mconstruction\u001b[0m \u001b[0mgenerator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 628\u001b[0m \"\"\"\n\u001b[1;32m--> 629\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_create_generator\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msim_params\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 630\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 631\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moverwrite_sim_params\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 36 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36m_create_generator\u001b[1;34m(self, sim_params)\u001b[0m\n\u001b[0;32m 587\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 588\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitialized\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 589\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitialize\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitialize_args\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitialize_kwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 590\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitialized\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 591\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 37 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36minitialize\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 449\u001b[0m \"\"\"\n\u001b[0;32m 450\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mZiplineAPI\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 451\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_initialize\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 452\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 453\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mbefore_trading_start\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 38 | "\u001b[1;32m\u001b[0m in \u001b[0;36minitialize\u001b[1;34m(context)\u001b[0m\n\u001b[0;32m 165\u001b[0m context.universe = [\n\u001b[0;32m 166\u001b[0m \u001b[0mcontinuous_future\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmarket\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moffset\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mroll\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'volume'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0madjustment\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'mul'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 167\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mmarket\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mmarkets\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 168\u001b[0m ]\n\u001b[0;32m 169\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 39 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 165\u001b[0m context.universe = [\n\u001b[0;32m 166\u001b[0m \u001b[0mcontinuous_future\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmarket\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moffset\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mroll\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'volume'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0madjustment\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'mul'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 167\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mmarket\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mmarkets\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 168\u001b[0m ]\n\u001b[0;32m 169\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 40 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\utils\\api_support.py\u001b[0m in \u001b[0;36mwrapped\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 54\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 55\u001b[0m )\n\u001b[1;32m---> 56\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0malgo_instance\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 57\u001b[0m \u001b[1;31m# Add functor to zipline.api\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 58\u001b[0m \u001b[0msetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mzipline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapi\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwrapped\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 41 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36mcontinuous_future\u001b[1;34m(self, root_symbol_str, offset, roll, adjustment)\u001b[0m\n\u001b[0;32m 1249\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mpreprocess\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroot_symbol_str\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mensure_upper_case\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1250\u001b[0m def continuous_future(self,\n\u001b[1;32m-> 1251\u001b[1;33m \u001b[0mroot_symbol_str\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1252\u001b[0m \u001b[0moffset\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1253\u001b[0m \u001b[0mroll\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'volume'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 42 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\algorithm.py\u001b[0m in \u001b[0;36mcontinuous_future\u001b[1;34m(self, root_symbol_str, offset, roll, adjustment)\u001b[0m\n\u001b[0;32m 1279\u001b[0m \u001b[0moffset\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1280\u001b[0m \u001b[0mroll\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1281\u001b[1;33m \u001b[0madjustment\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1282\u001b[0m )\n\u001b[0;32m 1283\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 43 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\assets\\assets.py\u001b[0m in \u001b[0;36mcreate_continuous_future\u001b[1;34m(self, root_symbol, offset, roll_style, adjustment)\u001b[0m\n\u001b[0;32m 1035\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1036\u001b[0m \u001b[0moc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_ordered_contracts\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroot_symbol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1037\u001b[1;33m \u001b[0mexchange\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_root_symbol_exchange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroot_symbol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1038\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1039\u001b[0m sid = _encode_continuous_future_sid(root_symbol, offset,\n", 44 | "\u001b[1;32mC:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\zipline\\assets\\assets.py\u001b[0m in \u001b[0;36m_get_root_symbol_exchange\u001b[1;34m(self, root_symbol)\u001b[0m\n\u001b[0;32m 1009\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mexchange\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1010\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1011\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mSymbolNotFound\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msymbol\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mroot_symbol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1012\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1013\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget_ordered_contracts\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mroot_symbol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 45 | "\u001b[1;31mSymbolNotFound\u001b[0m: Symbol 'BL' was not found." 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "%matplotlib inline\n", 51 | "\n", 52 | "import zipline\n", 53 | "from zipline.api import future_symbol, \\\n", 54 | " set_commission, set_slippage, schedule_function, date_rules, \\\n", 55 | " time_rules, continuous_future, order_target\n", 56 | "from datetime import datetime\n", 57 | "import pytz\n", 58 | "import matplotlib.pyplot as plt\n", 59 | "import pyfolio as pf\n", 60 | "import pandas as pd\n", 61 | "import numpy as np \n", 62 | "from zipline.finance.commission import PerTrade, PerContract\n", 63 | "from zipline.finance.slippage import VolumeShareSlippage, \\\n", 64 | " FixedSlippage, VolatilityVolumeShare\n", 65 | "\n", 66 | "# These lines are for the dynamic text reporting\n", 67 | "from IPython.display import display\n", 68 | "import ipywidgets as widgets\n", 69 | "out = widgets.HTML()\n", 70 | "display(out)\n", 71 | "\n", 72 | "\"\"\"\n", 73 | "Model Settings\n", 74 | "\"\"\"\n", 75 | "starting_portfolio = 50000000\n", 76 | "risk_factor = 0.0015\n", 77 | "stop_distance = 3\n", 78 | "breakout_window = 50\n", 79 | "vola_window = 40\n", 80 | "slow_ma = 80\n", 81 | "fast_ma = 40\n", 82 | "enable_commission = True\n", 83 | "enable_slippage = True \n", 84 | "\n", 85 | "\n", 86 | "def report_result(context, data):\n", 87 | " context.months += 1\n", 88 | " today = zipline.api.get_datetime().date()\n", 89 | " # Calculate annualized return so far\n", 90 | " ann_ret = np.power(context.portfolio.portfolio_value / starting_portfolio, \n", 91 | " 12 / context.months) - 1\n", 92 | " \n", 93 | " # Update the text\n", 94 | " out.value = \"\"\"{} We have traded {} months \n", 95 | " and the annualized return is {:.2%}\"\"\".format(today, context.months, ann_ret)\n", 96 | "\n", 97 | "def roll_futures(context, data):\n", 98 | " open_orders = zipline.api.get_open_orders()\n", 99 | " \n", 100 | " for held_contract in context.portfolio.positions:\n", 101 | " # don't roll positions that are set to change by core logic\n", 102 | " if held_contract in open_orders: \n", 103 | " continue\n", 104 | " \n", 105 | " # Save some time by only checking rolls for\n", 106 | " # contracts stopping trading in the next days\n", 107 | " days_to_auto_close = (\n", 108 | " held_contract.auto_close_date.date() - data.current_session.date()\n", 109 | " ).days\n", 110 | " if days_to_auto_close > 5:\n", 111 | " continue \n", 112 | " \n", 113 | " # Make a continuation\n", 114 | " continuation = continuous_future(\n", 115 | " held_contract.root_symbol, \n", 116 | " offset=0, \n", 117 | " roll='volume', \n", 118 | " adjustment='mul'\n", 119 | " )\n", 120 | " \n", 121 | " # Get the current contract of the continuation\n", 122 | " continuation_contract = data.current(continuation, 'contract')\n", 123 | " \n", 124 | " if continuation_contract != held_contract:\n", 125 | " # Check how many contracts we hold\n", 126 | " pos_size = context.portfolio.positions[held_contract].amount \n", 127 | " # Close current position\n", 128 | " order_target(held_contract, 0)\n", 129 | " # Open new position\n", 130 | " order_target(continuation_contract, pos_size) \n", 131 | " \n", 132 | "def position_size(portfolio_value, std, point_value):\n", 133 | " target_variation = portfolio_value * risk_factor\n", 134 | " contract_variation = std * point_value\n", 135 | " contracts = target_variation / contract_variation\n", 136 | " return int(np.nan_to_num(contracts)) \n", 137 | " \n", 138 | "def initialize(context):\n", 139 | " \n", 140 | " \"\"\"\n", 141 | " Cost Settings\n", 142 | " \"\"\"\n", 143 | " if enable_commission:\n", 144 | " comm_model = PerContract(cost=0.85, exchange_fee=1.5)\n", 145 | " else:\n", 146 | " comm_model = PerTrade(cost=0.0)\n", 147 | " \n", 148 | " set_commission(us_futures=comm_model)\n", 149 | " \n", 150 | " if enable_slippage:\n", 151 | " slippage_model=VolatilityVolumeShare(volume_limit=0.2)\n", 152 | " else:\n", 153 | " slippage_model=FixedSlippage(spread=0.0) \n", 154 | " \n", 155 | " set_slippage(us_futures=slippage_model)\n", 156 | " \n", 157 | " \"\"\"\n", 158 | " Markets to trade\n", 159 | " \"\"\" \n", 160 | " currencies = [\n", 161 | " 'AD',\n", 162 | " 'BP',\n", 163 | " 'CD',\n", 164 | " 'CU',\n", 165 | " 'DX',\n", 166 | " 'JY',\n", 167 | " 'NE',\n", 168 | " 'SF',\n", 169 | " ]\n", 170 | " \n", 171 | " agricultural = [\n", 172 | " 'BL',\n", 173 | " '_C',\n", 174 | " 'CT',\n", 175 | " 'FC',\n", 176 | " 'KC',\n", 177 | " 'LR',\n", 178 | " 'LS',\n", 179 | " '_O',\n", 180 | " '_S',\n", 181 | " 'SB',\n", 182 | " 'SM',\n", 183 | " '_W',\n", 184 | " ]\n", 185 | " nonagricultural = [\n", 186 | " 'CL',\n", 187 | " 'GC',\n", 188 | " 'HG',\n", 189 | " 'HO',\n", 190 | " 'LG',\n", 191 | " 'NG',\n", 192 | " 'PA',\n", 193 | " 'PL',\n", 194 | " 'RB',\n", 195 | " 'SI',\n", 196 | " ]\n", 197 | " equities = [\n", 198 | " 'ES',\n", 199 | " 'NK',\n", 200 | " 'NQ',\n", 201 | " 'TW',\n", 202 | " 'VX',\n", 203 | " 'YM',\n", 204 | " ]\n", 205 | " rates = [\n", 206 | " 'ED',\n", 207 | " 'FV',\n", 208 | " 'TU',\n", 209 | " 'TY',\n", 210 | " 'US',\n", 211 | " ]\n", 212 | " \n", 213 | " # Make a list of all the markets\n", 214 | " markets = currencies + agricultural + nonagricultural + equities + rates\n", 215 | " \n", 216 | " # Make a list of all continuations\n", 217 | " context.universe = [\n", 218 | " continuous_future(market, offset=0, roll='volume', adjustment='mul')\n", 219 | " for market in markets\n", 220 | " ]\n", 221 | " \n", 222 | " # We'll use these to keep track of best position reading\n", 223 | " # Used to calculate stop points.\n", 224 | " context.highest_in_position = {market: 0 for market in markets} \n", 225 | " context.lowest_in_position = {market: 0 for market in markets} \n", 226 | " \n", 227 | " # Schedule the daily trading\n", 228 | " schedule_function(daily_trade, date_rules.every_day(), time_rules.market_close())\n", 229 | " \n", 230 | " # We'll just use this for the progress output\n", 231 | " # during the backtest. Doesn't impact anything.\n", 232 | " context.months = 0 \n", 233 | " \n", 234 | " # Schedule monthly report output\n", 235 | " schedule_function(\n", 236 | " func=report_result,\n", 237 | " date_rule=date_rules.month_start(),\n", 238 | " time_rule=time_rules.market_open()\n", 239 | " ) \n", 240 | " \n", 241 | "def analyze(context, perf):\n", 242 | " returns, positions, transactions = pf.utils.extract_rets_pos_txn_from_zipline(perf)\n", 243 | " pf.create_returns_tear_sheet(returns, benchmark_rets=None)\n", 244 | " \n", 245 | "def daily_trade(context, data):\n", 246 | " # Get continuation data\n", 247 | " hist = data.history(\n", 248 | " context.universe, \n", 249 | " fields=['close','volume'], \n", 250 | " frequency='1d', \n", 251 | " bar_count=250,\n", 252 | " )\n", 253 | " \n", 254 | " # Calculate trend\n", 255 | " hist['trend'] = hist['close'].ewm(span=fast_ma).mean() > hist['close'].ewm(span=slow_ma).mean() \n", 256 | " \n", 257 | " # Make dictionary of open positions\n", 258 | " open_pos = {\n", 259 | " pos.root_symbol: pos \n", 260 | " for pos in context.portfolio.positions\n", 261 | " } \n", 262 | " \n", 263 | " # Iterate markets, check for trades\n", 264 | " for continuation in context.universe:\n", 265 | " \n", 266 | " # Get root symbol of continuation\n", 267 | " root = continuation.root_symbol\n", 268 | " \n", 269 | " # Slice off history for just this market\n", 270 | " h = hist.xs(continuation, 2)\n", 271 | " \n", 272 | " # Get standard deviation\n", 273 | " std = h.close.diff()[-vola_window:].std()\n", 274 | "\n", 275 | " if root in open_pos: # Position is open\n", 276 | "\n", 277 | " # Get position\n", 278 | " p = context.portfolio.positions[open_pos[root]]\n", 279 | " \n", 280 | " if p.amount > 0: # Position is long\n", 281 | " if context.highest_in_position[root] == 0: # First day holding the position\n", 282 | " context.highest_in_position[root] = p.cost_basis\n", 283 | " else:\n", 284 | " context.highest_in_position[root] = max(\n", 285 | " h['close'].iloc[-1], context.highest_in_position[root]\n", 286 | " ) \n", 287 | " \n", 288 | " # Calculate stop point\n", 289 | " stop = context.highest_in_position[root] - (std * stop_distance)\n", 290 | " # Check if stop is hit\n", 291 | " if h.iloc[-1]['close'] < stop:\n", 292 | " contract = open_pos[root]\n", 293 | " order_target(contract, 0)\n", 294 | " context.highest_in_position[root] = 0\n", 295 | " # Check if trend has flipped\n", 296 | " elif h['trend'].iloc[-1] == False:\n", 297 | " contract = open_pos[root]\n", 298 | " order_target(contract, 0)\n", 299 | " context.highest_in_position[root] = 0\n", 300 | " \n", 301 | " else: # Position is short\n", 302 | " if context.lowest_in_position[root] == 0: # First day holding the position\n", 303 | " context.lowest_in_position[root] = p.cost_basis\n", 304 | " else:\n", 305 | " context.lowest_in_position[root] = min(\n", 306 | " h['close'].iloc[-1], context.lowest_in_position[root]\n", 307 | " )\n", 308 | " \n", 309 | " # Calculate stop point\n", 310 | " stop = context.lowest_in_position[root] + (std * stop_distance)\n", 311 | " \n", 312 | " # Check if stop is hit\n", 313 | " if h.iloc[-1]['close'] > stop:\n", 314 | " contract = open_pos[root]\n", 315 | " order_target(contract, 0)\n", 316 | " context.lowest_in_position[root] = 0\n", 317 | " # Check if trend has flipped\n", 318 | " elif h['trend'].iloc[-1] == True:\n", 319 | " contract = open_pos[root]\n", 320 | " order_target(contract, 0)\n", 321 | " context.lowest_in_position[root] = 0 \n", 322 | " \n", 323 | " else: # No position on\n", 324 | " if h['trend'].iloc[-1]: # Bull trend\n", 325 | " # Check if we just made a new high\n", 326 | " if h['close'][-1] == h[-breakout_window:]['close'].max(): \n", 327 | " contract = data.current(continuation, 'contract')\n", 328 | "\n", 329 | " contracts_to_trade = position_size( \\\n", 330 | " context.portfolio.portfolio_value, \\\n", 331 | " std, \\\n", 332 | " contract.price_multiplier)\n", 333 | " \n", 334 | " # Limit size to 20% of avg. daily volume\n", 335 | " contracts_cap = int(h['volume'][-20:].mean() * 0.2)\n", 336 | " contracts_to_trade = min(contracts_to_trade, contracts_cap)\n", 337 | " \n", 338 | " # Place the order\n", 339 | " order_target(contract, contracts_to_trade)\n", 340 | " \n", 341 | " else: # Bear trend\n", 342 | " # Check if we just made a new low\n", 343 | " if h['close'][-1] == h[-breakout_window:]['close'].min(): \n", 344 | " contract = data.current(continuation, 'contract')\n", 345 | "\n", 346 | " contracts_to_trade = position_size( \\\n", 347 | " context.portfolio.portfolio_value, \\\n", 348 | " std, \\\n", 349 | " contract.price_multiplier)\n", 350 | " \n", 351 | " # Limit size to 20% of avg. daily volume\n", 352 | " contracts_cap = int(h['volume'][-20:].mean() * 0.2)\n", 353 | " contracts_to_trade = min(contracts_to_trade, contracts_cap)\n", 354 | " \n", 355 | " # Place the order\n", 356 | " order_target(contract, -1 * contracts_to_trade)\n", 357 | " \n", 358 | " # If we have open positions, check for rolls\n", 359 | " if len(open_pos) > 0: \n", 360 | " roll_futures(context, data) \n", 361 | " \n", 362 | "start = datetime(2001, 1, 1, 8, 15, 12, 0, pytz.UTC)\n", 363 | "end = datetime(2019, 1, 2, 8, 15, 12, 0, pytz.UTC)\n", 364 | "\n", 365 | "perf = zipline.run_algorithm(\n", 366 | " start=start, end=end, \n", 367 | " initialize=initialize, \n", 368 | " analyze=analyze,\n", 369 | " capital_base=starting_portfolio, \n", 370 | " data_frequency = 'daily', \n", 371 | " bundle='rand_fut' ) " 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 7, 377 | "metadata": {}, 378 | "outputs": [], 379 | "source": [ 380 | "perf.portfolio_value.to_csv('trend_model.csv')" 381 | ] 382 | } 383 | ], 384 | "metadata": { 385 | "kernelspec": { 386 | "display_name": "Python [conda env:zip35]", 387 | "language": "python", 388 | "name": "conda-env-zip35-py" 389 | } 390 | }, 391 | "nbformat": 4, 392 | "nbformat_minor": 2 393 | } 394 | -------------------------------------------------------------------------------- /Chapter 21- Monkeys/Monkey Business.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 27, 6 | "metadata": { 7 | "scrolled": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Processing run 1\n" 15 | ] 16 | }, 17 | { 18 | "name": "stderr", 19 | "output_type": "stream", 20 | "text": [ 21 | "C:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\empyrical\\stats.py:790: RuntimeWarning: invalid value encountered in true_divide\n", 22 | " np.divide(average_annual_return, annualized_downside_risk, out=out)\n", 23 | "C:\\ProgramData\\Anaconda3_new\\envs\\zip35\\lib\\site-packages\\empyrical\\stats.py:704: RuntimeWarning: invalid value encountered in true_divide\n", 24 | " out=out,\n" 25 | ] 26 | }, 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "Processing run 2\n", 32 | "All Done. Ready to analyze.\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "%matplotlib inline\n", 38 | "\n", 39 | "import zipline\n", 40 | "from zipline.api import order_target_percent, symbol, set_commission, \\\n", 41 | " set_slippage, schedule_function, date_rules, time_rules\n", 42 | "\n", 43 | "from zipline.finance.commission import PerTrade, PerDollar\n", 44 | "from zipline.finance.slippage import VolumeShareSlippage, FixedSlippage\n", 45 | "\n", 46 | "from datetime import datetime\n", 47 | "import pytz\n", 48 | "import pandas as pd\n", 49 | "import numpy as np \n", 50 | "\n", 51 | "# To generate random numbers\n", 52 | "from random import random, seed, randrange\n", 53 | "\n", 54 | "\"\"\"\n", 55 | "Settings\n", 56 | "\"\"\"\n", 57 | "number_of_runs = 2\n", 58 | "random_portfolio_size = False\n", 59 | "number_of_stocks = 50 # portfolio size, if not random \n", 60 | "sizing_method = 'equal' # equal or random\n", 61 | "\n", 62 | "enable_commission = False\n", 63 | "commission_pct = 0.001\n", 64 | "enable_slippage = False \n", 65 | "slippage_volume_limit = 0.25\n", 66 | "slippage_impact = 0.05\n", 67 | "\n", 68 | "def initialize(context):\n", 69 | " # Fetch and store index membership\n", 70 | " context.index_members = pd.read_csv('../data/index_members/sp500.csv', index_col=0, parse_dates=[0])\n", 71 | " \n", 72 | " # Set commission and slippage.\n", 73 | " if enable_commission:\n", 74 | " comm_model = PerDollar(cost=commission_pct)\n", 75 | " else:\n", 76 | " comm_model = PerDollar(cost=0.0)\n", 77 | " set_commission(comm_model)\n", 78 | " \n", 79 | " if enable_slippage:\n", 80 | " slippage_model=VolumeShareSlippage(volume_limit=slippage_volume_limit, price_impact=slippage_impact)\n", 81 | " \n", 82 | " else:\n", 83 | " slippage_model=FixedSlippage(spread=0.0) \n", 84 | " set_slippage(slippage_model) \n", 85 | " \n", 86 | " \n", 87 | " schedule_function(\n", 88 | " func=rebalance,\n", 89 | " date_rule=date_rules.month_start(),\n", 90 | " time_rule=time_rules.market_open()\n", 91 | " )\n", 92 | "\n", 93 | "def rebalance(context, data):\n", 94 | " today = zipline.api.get_datetime()\n", 95 | " \n", 96 | " # Check eligible stocks\n", 97 | " todays_universe = [\n", 98 | " symbol(ticker) for ticker in \n", 99 | " context.index_members.loc[context.index_members.index < today].iloc[-1,0].split(',')\n", 100 | " ]\n", 101 | " \n", 102 | " # Make a list of stocks to buy\n", 103 | " buys = []\n", 104 | " \n", 105 | " # To modify global variable, and not make new one\n", 106 | " global number_of_stocks \n", 107 | " \n", 108 | " # If random stockss selected\n", 109 | " if random_portfolio_size:\n", 110 | " # Buy between 5 and 200 stocks.\n", 111 | " number_of_stocks = randrange(5, 200)\n", 112 | " \n", 113 | " # Select stocks\n", 114 | " for i in np.arange(1, number_of_stocks +1):\n", 115 | " num = randrange(0, len(todays_universe) -1)\n", 116 | " buys.append(todays_universe.pop(num))\n", 117 | " \n", 118 | " # Sell positions no longer wanted.\n", 119 | " for security in context.portfolio.positions:\n", 120 | " if (security not in buys):\n", 121 | " order_target_percent(security, 0.0)\n", 122 | " \n", 123 | " #Make an empty DataFrame to hold target position sizes\n", 124 | " buy_size = pd.DataFrame(index=buys)\n", 125 | " \n", 126 | " # Get random sizes, if enabled.\n", 127 | " if sizing_method == 'random':\n", 128 | " buy_size['rand'] = [randrange(1,100) for x in buy_size.iterrows()] \n", 129 | " buy_size['target_weight'] = buy_size['rand'] / buy_size['rand'].sum()\n", 130 | " elif sizing_method == 'equal':\n", 131 | " buy_size['target_weight'] = 1.0 / number_of_stocks\n", 132 | " \n", 133 | " # Send buy orders\n", 134 | " for security in buys: \n", 135 | " order_target_percent(security, buy_size.loc[security, 'target_weight'])\n", 136 | " \n", 137 | "start = datetime(1996, 1, 1, tzinfo=pytz.UTC)\n", 138 | "end = datetime(2018, 12, 31, tzinfo=pytz.UTC)\n", 139 | "\n", 140 | "# Empty DataFrame to hold the results\n", 141 | "df = pd.DataFrame()\n", 142 | "\n", 143 | "# Run the backtests\n", 144 | "for i in np.arange(1, number_of_runs + 1):\n", 145 | " print('Processing run ' + str(i))\n", 146 | " \n", 147 | " result = zipline.run_algorithm(\n", 148 | " start=start, end=end, \n", 149 | " initialize=initialize, \n", 150 | " capital_base=100000, \n", 151 | " data_frequency = 'daily', \n", 152 | " bundle='ac_equities_db' )\n", 153 | " \n", 154 | " df[i] = result['portfolio_value']\n", 155 | "\n", 156 | "print('All Done. Ready to analyze.')" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 26, 162 | "metadata": {}, 163 | "outputs": [ 164 | { 165 | "data": { 166 | "text/html": [ 167 | "
\n", 168 | "\n", 181 | "\n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | "
12
1996-01-02 21:00:00+00:00100000.000100000.000
1996-01-03 21:00:00+00:00100000.000100000.000
1996-01-04 21:00:00+00:0099093.71198668.122
1996-01-05 21:00:00+00:0098918.11798572.710
1996-01-08 21:00:00+00:0099034.94998821.249
\n", 217 | "
" 218 | ], 219 | "text/plain": [ 220 | " 1 2\n", 221 | "1996-01-02 21:00:00+00:00 100000.000 100000.000\n", 222 | "1996-01-03 21:00:00+00:00 100000.000 100000.000\n", 223 | "1996-01-04 21:00:00+00:00 99093.711 98668.122\n", 224 | "1996-01-05 21:00:00+00:00 98918.117 98572.710\n", 225 | "1996-01-08 21:00:00+00:00 99034.949 98821.249" 226 | ] 227 | }, 228 | "execution_count": 26, 229 | "metadata": {}, 230 | "output_type": "execute_result" 231 | } 232 | ], 233 | "source": [ 234 | "# Save backtests to disk\n", 235 | "df.to_csv(\"Random backtests.csv\")\n" 236 | ] 237 | } 238 | ], 239 | "metadata": { 240 | "kernelspec": { 241 | "display_name": "Python [conda env:zip35]", 242 | "language": "python", 243 | "name": "conda-env-zip35-py" 244 | }, 245 | "language_info": { 246 | "codemirror_mode": { 247 | "name": "ipython", 248 | "version": 3 249 | }, 250 | "file_extension": ".py", 251 | "mimetype": "text/x-python", 252 | "name": "python", 253 | "nbconvert_exporter": "python", 254 | "pygments_lexer": "ipython3", 255 | "version": "3.5.5" 256 | } 257 | }, 258 | "nbformat": 4, 259 | "nbformat_minor": 2 260 | } 261 | -------------------------------------------------------------------------------- /Chapter 23 - Importing your Data/random_futures_data.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from os import listdir 3 | from tqdm import tqdm # Used for progress bar 4 | 5 | # Change the path to where you have your data 6 | base_path = "C:/Users/Andreas Clenow/BookSamples/BookModels/data/" 7 | data_path = base_path + 'random_futures/' 8 | meta_path = 'futures_meta/meta.csv' 9 | futures_lookup = pd.read_csv(base_path + meta_path, index_col=0) 10 | 11 | """ 12 | The ingest function needs to have this exact signature, 13 | meaning these arguments passed, as shown below. 14 | """ 15 | def random_futures_data(environ, 16 | asset_db_writer, 17 | minute_bar_writer, 18 | daily_bar_writer, 19 | adjustment_writer, 20 | calendar, 21 | start_session, 22 | end_session, 23 | cache, 24 | show_progress, 25 | output_dir): 26 | 27 | # Get list of files from path 28 | # Slicing off the last part 29 | # 'example.csv'[:-4] = 'example' 30 | symbols = [f[:-4] for f in listdir(data_path)] 31 | 32 | if not symbols: 33 | raise ValueError("No symbols found in folder.") 34 | 35 | # Prepare an empty DataFrame for dividends 36 | divs = pd.DataFrame(columns=['sid', 37 | 'amount', 38 | 'ex_date', 39 | 'record_date', 40 | 'declared_date', 41 | 'pay_date'] 42 | ) 43 | 44 | # Prepare an empty DataFrame for splits 45 | splits = pd.DataFrame(columns=['sid', 46 | 'ratio', 47 | 'effective_date'] 48 | ) 49 | 50 | # Prepare an empty DataFrame for metadata 51 | metadata = pd.DataFrame(columns=('start_date', 52 | 'end_date', 53 | 'auto_close_date', 54 | 'symbol', 55 | 'root_symbol', 56 | 'expiration_date', 57 | 'notice_date', 58 | 'tick_size', 59 | 'exchange' 60 | ) 61 | ) 62 | 63 | # Check valid trading dates, according to the selected exchange calendar 64 | sessions = calendar.sessions_in_range(start_session, end_session) 65 | 66 | # Get data for all stocks and write to Zipline 67 | daily_bar_writer.write( 68 | process_futures(symbols, sessions, metadata) 69 | ) 70 | 71 | adjustment_writer.write(splits=splits, dividends=divs) 72 | 73 | # Prepare root level metadata 74 | root_symbols = futures_lookup.copy() 75 | root_symbols['root_symbol_id'] = root_symbols.index.values 76 | del root_symbols['minor_fx_adj'] 77 | 78 | #write the meta data 79 | asset_db_writer.write(futures=metadata, root_symbols=root_symbols) 80 | 81 | def process_futures(symbols, sessions, metadata): 82 | # Loop the stocks, setting a unique Security ID (SID) 83 | sid = 0 84 | 85 | # Loop the symbols with progress bar, using tqdm 86 | for symbol in tqdm(symbols, desc='Loading data...'): 87 | sid += 1 88 | 89 | # Read the stock data from csv file. 90 | df = pd.read_csv('{}/{}.csv'.format(data_path, symbol), index_col=[0], parse_dates=[0]) 91 | 92 | # Check for minor currency quotes 93 | adjustment_factor = futures_lookup.loc[ 94 | futures_lookup['root_symbol'] == df.iloc[0]['root_symbol'] 95 | ]['minor_fx_adj'].iloc[0] 96 | 97 | df['open'] *= adjustment_factor 98 | df['high'] *= adjustment_factor 99 | df['low'] *= adjustment_factor 100 | df['close'] *= adjustment_factor 101 | 102 | # Avoid potential high / low data errors in data set 103 | # And apply minor currency adjustment for USc quotes 104 | df['high'] = df[['high', 'close']].max(axis=1) 105 | df['low'] = df[['low', 'close']].min(axis=1) 106 | df['high'] = df[['high', 'open']].max(axis=1) 107 | df['low'] = df[['low', 'open']].min(axis=1) 108 | 109 | # Synch to the official exchange calendar 110 | df = df.reindex(sessions.tz_localize(None))[df.index[0]:df.index[-1] ] 111 | 112 | # Forward fill missing data 113 | df.fillna(method='ffill', inplace=True) 114 | 115 | # Drop remaining NaN 116 | df.dropna(inplace=True) 117 | 118 | # Cut dates before 2000, avoiding Zipline issue 119 | df = df['2000-01-01':] 120 | 121 | # Prepare contract metadata 122 | make_meta(sid, metadata, df, sessions) 123 | 124 | del df['openinterest'] 125 | del df['expiration_date'] 126 | del df['root_symbol'] 127 | del df['symbol'] 128 | 129 | yield sid, df 130 | 131 | def make_meta(sid, metadata, df, sessions): 132 | # Check first and last date. 133 | start_date = df.index[0] 134 | end_date = df.index[-1] 135 | 136 | # The auto_close date is the day after the last trade. 137 | ac_date = end_date + pd.Timedelta(days=1) 138 | 139 | symbol = df.iloc[0]['symbol'] 140 | root_sym = df.iloc[0]['root_symbol'] 141 | exchng = futures_lookup.loc[futures_lookup['root_symbol'] == root_sym ]['exchange'].iloc[0] 142 | exp_date = end_date 143 | 144 | # Add notice day if you have. 145 | # Tip to improve: Set notice date to one month prior to 146 | # expiry for commodity markets. 147 | notice_date = ac_date 148 | tick_size = 0.0001 # Placeholder 149 | 150 | # Add a row to the metadata DataFrame. 151 | metadata.loc[sid] = start_date, end_date, ac_date, symbol, \ 152 | root_sym, exp_date, notice_date, tick_size, exchng 153 | 154 | -------------------------------------------------------------------------------- /Chapter 23 - Importing your Data/random_stock_data.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from os import listdir 3 | 4 | # Change the path to where you have your data 5 | path = 'C:\\Users\\Andreas Clenow\\BookSamples\\BookModels\\data\\random_stocks\\' 6 | 7 | 8 | """ 9 | The ingest function needs to have this exact signature, 10 | meaning these arguments passed, as shown below. 11 | """ 12 | def random_stock_data(environ, 13 | asset_db_writer, 14 | minute_bar_writer, 15 | daily_bar_writer, 16 | adjustment_writer, 17 | calendar, 18 | start_session, 19 | end_session, 20 | cache, 21 | show_progress, 22 | output_dir): 23 | 24 | # Get list of files from path 25 | # Slicing off the last part 26 | # 'example.csv'[:-4] = 'example' 27 | symbols = [f[:-4] for f in listdir(path)] 28 | 29 | if not symbols: 30 | raise ValueError("No symbols found in folder.") 31 | 32 | 33 | # Prepare an empty DataFrame for dividends 34 | divs = pd.DataFrame(columns=['sid', 35 | 'amount', 36 | 'ex_date', 37 | 'record_date', 38 | 'declared_date', 39 | 'pay_date'] 40 | ) 41 | 42 | # Prepare an empty DataFrame for splits 43 | splits = pd.DataFrame(columns=['sid', 44 | 'ratio', 45 | 'effective_date'] 46 | ) 47 | 48 | # Prepare an empty DataFrame for metadata 49 | metadata = pd.DataFrame(columns=('start_date', 50 | 'end_date', 51 | 'auto_close_date', 52 | 'symbol', 53 | 'exchange' 54 | ) 55 | ) 56 | 57 | 58 | # Check valid trading dates, according to the selected exchange calendar 59 | sessions = calendar.sessions_in_range(start_session, end_session) 60 | 61 | # Get data for all stocks and write to Zipline 62 | daily_bar_writer.write( 63 | process_stocks(symbols, sessions, metadata, divs) 64 | ) 65 | 66 | # Write the metadata 67 | asset_db_writer.write(equities=metadata) 68 | 69 | # Write splits and dividends 70 | adjustment_writer.write(splits=splits, 71 | dividends=divs) 72 | 73 | 74 | """ 75 | Generator function to iterate stocks, 76 | build historical data, metadata 77 | and dividend data 78 | """ 79 | def process_stocks(symbols, sessions, metadata, divs): 80 | # Loop the stocks, setting a unique Security ID (SID) 81 | for sid, symbol in enumerate(symbols): 82 | 83 | print('Loading {}...'.format(symbol)) 84 | # Read the stock data from csv file. 85 | df = pd.read_csv('{}/{}.csv'.format(path, symbol), index_col=[0], parse_dates=[0]) 86 | 87 | # Check first and last date. 88 | start_date = df.index[0] 89 | end_date = df.index[-1] 90 | 91 | # Synch to the official exchange calendar 92 | df = df.reindex(sessions.tz_localize(None))[start_date:end_date] 93 | 94 | # Forward fill missing data 95 | df.fillna(method='ffill', inplace=True) 96 | 97 | # Drop remaining NaN 98 | df.dropna(inplace=True) 99 | 100 | # The auto_close date is the day after the last trade. 101 | ac_date = end_date + pd.Timedelta(days=1) 102 | 103 | # Add a row to the metadata DataFrame. Don't forget to add an exchange field. 104 | metadata.loc[sid] = start_date, end_date, ac_date, symbol, "NYSE" 105 | 106 | # If there's dividend data, add that to the dividend DataFrame 107 | if 'dividend' in df.columns: 108 | 109 | # Slice off the days with dividends 110 | tmp = df[df['dividend'] != 0.0]['dividend'] 111 | div = pd.DataFrame(data=tmp.index.tolist(), columns=['ex_date']) 112 | 113 | # Provide empty columns as we don't have this data for now 114 | div['record_date'] = pd.NaT 115 | div['declared_date'] = pd.NaT 116 | div['pay_date'] = pd.NaT 117 | 118 | # Store the dividends and set the Security ID 119 | div['amount'] = tmp.tolist() 120 | div['sid'] = sid 121 | 122 | # Start numbering at where we left off last time 123 | ind = pd.Index(range(divs.shape[0], divs.shape[0] + div.shape[0])) 124 | div.set_index(ind, inplace=True) 125 | 126 | # Append this stock's dividends to the list of all dividends 127 | divs = divs.append(div) 128 | 129 | yield sid, df -------------------------------------------------------------------------------- /Chapter 24 - Data and Databases/Populating Database.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 26, 6 | "metadata": { 7 | "scrolled": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import os\n", 12 | "import pandas as pd\n", 13 | "from sqlalchemy import create_engine\n", 14 | "from tqdm import tqdm_notebook\n", 15 | "\n", 16 | "engine = create_engine('mysql+mysqlconnector://root:root@localhost/mimisbrunnr')\n", 17 | "\n", 18 | "data_location = '../data/random_stocks/'\n", 19 | "\n", 20 | "\"\"\"\n", 21 | "Function: import_file\n", 22 | "Purpose: Reads a CSV file and stores the data in a database.\n", 23 | "\"\"\"\n", 24 | "def import_file(symbol):\n", 25 | " path = data_location + '{}.csv'.format(symbol)\n", 26 | " df = pd.read_csv(path, index_col=[0], parse_dates=[0])\n", 27 | " \n", 28 | " # First part of the instert statement\n", 29 | " insert_init = \"\"\"insert into equity_history \n", 30 | " (trade_date, ticker, open, high, low, close, volume, dividend, in_sp500)\n", 31 | " values \n", 32 | " \"\"\"\n", 33 | " \n", 34 | " # Add values for all days to the insert statement\n", 35 | " vals = \",\".join([\"\"\"('{}', '{}', {}, {}, {}, {}, {}, {}, {})\"\"\".format(\n", 36 | " str(day),\n", 37 | " symbol,\n", 38 | " row.open,\n", 39 | " row.high,\n", 40 | " row.low,\n", 41 | " row.close,\n", 42 | " row.volume,\n", 43 | " row.dividend,\n", 44 | " row.in_sp500\n", 45 | " ) for day, row in df.iterrows()]) \n", 46 | " \n", 47 | " # Handle duplicates - Avoiding errors if you've already got some data\n", 48 | " # in your table\n", 49 | " insert_end = \"\"\" on duplicate key update \n", 50 | " open=values(open),\n", 51 | " high=values(high),\n", 52 | " low=values(low),\n", 53 | " close=values(close),\n", 54 | " volume=values(volume),\n", 55 | " dividend=values(dividend),\n", 56 | " in_sp500=values(in_sp500);\"\"\"\n", 57 | "\n", 58 | " # Put the parts together\n", 59 | " query = insert_init + vals + insert\n", 60 | " \n", 61 | " # Fire insert statement\n", 62 | " engine.execute(query)\n", 63 | " " 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 25, 69 | "metadata": { 70 | "scrolled": false 71 | }, 72 | "outputs": [ 73 | { 74 | "data": { 75 | "application/vnd.jupyter.widget-view+json": { 76 | "model_id": "2a33134402294d0290442a2e0eadde41", 77 | "version_major": 2, 78 | "version_minor": 0 79 | }, 80 | "text/plain": [ 81 | "HBox(children=(IntProgress(value=0, description='Importing stocks...', max=643), HTML(value='')))" 82 | ] 83 | }, 84 | "metadata": {}, 85 | "output_type": "display_data" 86 | }, 87 | { 88 | "name": "stdout", 89 | "output_type": "stream", 90 | "text": [ 91 | "\n" 92 | ] 93 | } 94 | ], 95 | "source": [ 96 | "\"\"\"\n", 97 | "Function: get_symbols\n", 98 | "Purpose: Returns names of files in data directory.\n", 99 | "\"\"\"\n", 100 | "def process_symbols():\n", 101 | " # Remember slicing? Let's slice away the last four\n", 102 | " # characters, which will be '.csv'\n", 103 | " # Using [] to make a list of all the symbols\n", 104 | " symbols = [s[:-4] for s in os.listdir(data_location)]\n", 105 | " for symbol in tqdm_notebook(symbols, desc='Importing...'):\n", 106 | " import_file(symbol)\n", 107 | " \n", 108 | "process_symbols() " 109 | ] 110 | } 111 | ], 112 | "metadata": { 113 | "kernelspec": { 114 | "display_name": "Python [conda env:zip35]", 115 | "language": "python", 116 | "name": "conda-env-zip35-py" 117 | }, 118 | "language_info": { 119 | "codemirror_mode": { 120 | "name": "ipython", 121 | "version": 3 122 | }, 123 | "file_extension": ".py", 124 | "mimetype": "text/x-python", 125 | "name": "python", 126 | "nbconvert_exporter": "python", 127 | "pygments_lexer": "ipython3", 128 | "version": "3.5.5" 129 | } 130 | }, 131 | "nbformat": 4, 132 | "nbformat_minor": 2 133 | } 134 | -------------------------------------------------------------------------------- /Chapter 24 - Data and Databases/database_bundle.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from sqlalchemy import create_engine 3 | from tqdm import tqdm # Used for progress bar 4 | 5 | engine = create_engine('mysql+mysqlconnector://root:root@localhost/mimisbrunnr') 6 | 7 | def available_stocks(): 8 | symbol_query = "select distinct ticker from equity_history order by ticker" 9 | symbols = pd.read_sql_query(symbol_query, engine) 10 | return symbols.ticker 11 | 12 | 13 | """ 14 | The ingest function needs to have this exact signature, 15 | meaning these arguments passed, as shown below. 16 | """ 17 | def database_bundle(environ, 18 | asset_db_writer, 19 | minute_bar_writer, 20 | daily_bar_writer, 21 | adjustment_writer, 22 | calendar, 23 | start_session, 24 | end_session, 25 | cache, 26 | show_progress, 27 | output_dir): 28 | 29 | # Get list of files from path 30 | # Slicing off the last part 31 | # 'example.csv'[:-4] = 'example' 32 | symbols = available_stocks() 33 | 34 | # Prepare an empty DataFrame for dividends 35 | divs = pd.DataFrame(columns=['sid', 36 | 'amount', 37 | 'ex_date', 38 | 'record_date', 39 | 'declared_date', 40 | 'pay_date'] 41 | ) 42 | 43 | # Prepare an empty DataFrame for splits 44 | splits = pd.DataFrame(columns=['sid', 45 | 'ratio', 46 | 'effective_date'] 47 | ) 48 | 49 | # Prepare an empty DataFrame for metadata 50 | metadata = pd.DataFrame(columns=('start_date', 51 | 'end_date', 52 | 'auto_close_date', 53 | 'symbol', 54 | 'exchange' 55 | ) 56 | ) 57 | 58 | 59 | # Check valid trading dates, according to the selected exchange calendar 60 | sessions = calendar.sessions_in_range(start_session, end_session) 61 | 62 | # Get data for all stocks and write to Zipline 63 | daily_bar_writer.write( 64 | process_stocks(symbols, sessions, metadata, divs) 65 | ) 66 | 67 | # Write the metadata 68 | asset_db_writer.write(equities=metadata) 69 | 70 | # Write splits and dividends 71 | adjustment_writer.write(splits=splits, 72 | dividends=divs) 73 | 74 | 75 | """ 76 | Generator function to iterate stocks, 77 | build historical data, metadata 78 | and dividend data 79 | """ 80 | def process_stocks(symbols, sessions, metadata, divs): 81 | # Loop the stocks, setting a unique Security ID (SID) 82 | 83 | sid = 0 84 | for symbol in tqdm(symbols): 85 | sid += 1 86 | 87 | 88 | # Make a database query 89 | query = """select 90 | trade_date as date, open, high, low, close, volume, dividend 91 | from equity_history where ticker='{}' order by trade_date; 92 | """.format(symbol) 93 | 94 | # Ask the database for the data 95 | df = pd.read_sql_query(query, engine, index_col='date', parse_dates=['date']) 96 | 97 | # Check first and last date. 98 | start_date = df.index[0] 99 | end_date = df.index[-1] 100 | 101 | # Synch to the official exchange calendar 102 | df = df.reindex(sessions.tz_localize(None))[start_date:end_date] 103 | 104 | # Forward fill missing data 105 | df.fillna(method='ffill', inplace=True) 106 | 107 | # Drop remaining NaN 108 | df.dropna(inplace=True) 109 | 110 | # The auto_close date is the day after the last trade. 111 | ac_date = end_date + pd.Timedelta(days=1) 112 | 113 | # Add a row to the metadata DataFrame. 114 | metadata.loc[sid] = start_date, end_date, ac_date, symbol, 'NYSE' 115 | 116 | # If there's dividend data, add that to the dividend DataFrame 117 | if 'dividend' in df.columns: 118 | 119 | # Slice off the days with dividends 120 | tmp = df[df['dividend'] != 0.0]['dividend'] 121 | div = pd.DataFrame(data=tmp.index.tolist(), columns=['ex_date']) 122 | 123 | # Provide empty columns as we don't have this data for now 124 | div['record_date'] = pd.NaT 125 | div['declared_date'] = pd.NaT 126 | div['pay_date'] = pd.NaT 127 | 128 | # Store the dividends and set the Security ID 129 | div['amount'] = tmp.tolist() 130 | div['sid'] = sid 131 | 132 | # Start numbering at where we left off last time 133 | ind = pd.Index(range(divs.shape[0], divs.shape[0] + div.shape[0])) 134 | div.set_index(ind, inplace=True) 135 | 136 | # Append this stock's dividends to the list of all dividends 137 | divs = divs.append(div) 138 | 139 | yield sid, df -------------------------------------------------------------------------------- /Chapter 5 - Intro/Elementary Python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Papa John's Pizza\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "stocks = {\n", 20 | " \"CAKE\":\"Cheesecake Factory\",\n", 21 | " \"PZZA\":\"Papa John's Pizza\",\n", 22 | " \"FUN\":\"Cedar Fair\",\n", 23 | " \"CAR\": \"Avis Budget Group\",\n", 24 | " }\n", 25 | "\n", 26 | "print(stocks[\"PZZA\"])" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 3, 32 | "metadata": { 33 | "collapsed": false 34 | }, 35 | "outputs": [ 36 | { 37 | "name": "stdout", 38 | "output_type": "stream", 39 | "text": [ 40 | "Cheesecake Factory has ticker CAKE\n", 41 | "Papa John's Pizza has ticker PZZA\n", 42 | "Cedar Fair has ticker FUN\n", 43 | "Avis Budget Group has ticker CAR\n" 44 | ] 45 | } 46 | ], 47 | "source": [ 48 | "for ticker, name in stocks.items():\n", 49 | " print(\"{} has ticker {}\".format(name, ticker))\n" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "metadata": { 56 | "collapsed": false 57 | }, 58 | "outputs": [ 59 | { 60 | "name": "stdout", 61 | "output_type": "stream", 62 | "text": [ 63 | "1 is below ten.\n", 64 | "7 is below ten.\n", 65 | "The number three!\n", 66 | "6 is below ten.\n", 67 | "Number 12 is above ten.\n", 68 | "9 is below ten.\n", 69 | "Number 18 is above ten.\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "bunch_of_numbers = [\n", 75 | " 1, 7, 3, 6, 12, 9, 18\n", 76 | " ]\n", 77 | "\n", 78 | "for number in bunch_of_numbers:\n", 79 | " if number == 3:\n", 80 | " print(\"The number three!\")\n", 81 | " elif number < 10:\n", 82 | " print(\"{} is below ten.\".format(number))\n", 83 | " else:\n", 84 | " print(\"Number {} is above ten.\".format(number))\n" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 5, 90 | "metadata": { 91 | "collapsed": false 92 | }, 93 | "outputs": [ 94 | { 95 | "ename": "IndentationError", 96 | "evalue": "unindent does not match any outer indentation level (, line 9)", 97 | "output_type": "error", 98 | "traceback": [ 99 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m9\u001b[0m\n\u001b[0;31m elif number < 10:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unindent does not match any outer indentation level\n" 100 | ] 101 | } 102 | ], 103 | "source": [ 104 | "# There's a deliberate error in this cell\n", 105 | "bunch_of_numbers = [\n", 106 | " 1, 7, 3, 6, 12, 9, 18\n", 107 | " ]\n", 108 | "\n", 109 | "for number in bunch_of_numbers:\n", 110 | " if number == 3:\n", 111 | " print(\"The number three!\")\n", 112 | " elif number < 10:\n", 113 | " print(\"{} is below ten.\".format(number))\n", 114 | " else:\n", 115 | " print(\"Number {} is above ten.\".format(number))\n" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": { 122 | "collapsed": false 123 | }, 124 | "outputs": [ 125 | { 126 | "ename": "SyntaxError", 127 | "evalue": "Missing parentheses in call to 'print'. Did you mean print(\"The number three!\")? (, line 8)", 128 | "output_type": "error", 129 | "traceback": [ 130 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m print \"The number three!\"\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m Missing parentheses in call to 'print'. Did you mean print(\"The number three!\")?\n" 131 | ] 132 | } 133 | ], 134 | "source": [ 135 | "# There's a deliberate error in this cell\n", 136 | "bunch_of_numbers = [\n", 137 | " 1, 7, 3, 6, 12, 9, 18\n", 138 | " ]\n", 139 | "\n", 140 | "for number in bunch_of_numbers:\n", 141 | " if number == 3:\n", 142 | " print \"The number three!\"\n", 143 | " elif number < 10:\n", 144 | " print(\"{} is below ten.\".format(number))\n", 145 | " else:\n", 146 | " print(\"Number {} is above ten.\".format(number))\n" 147 | ] 148 | } 149 | ], 150 | "metadata": { 151 | "kernelspec": { 152 | "display_name": "Python 3", 153 | "language": "python", 154 | "name": "python3" 155 | }, 156 | "language_info": { 157 | "codemirror_mode": { 158 | "name": "ipython", 159 | "version": 3 160 | }, 161 | "file_extension": ".py", 162 | "mimetype": "text/x-python", 163 | "name": "python", 164 | "nbconvert_exporter": "python", 165 | "pygments_lexer": "ipython3", 166 | "version": "3.6.6" 167 | } 168 | }, 169 | "nbformat": 4, 170 | "nbformat_minor": 2 171 | } 172 | -------------------------------------------------------------------------------- /Chapter 5 - Intro/First Python Example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "There's a person called Tom\n", 15 | "There's a person called Dick\n", 16 | "There's a person called Harry\n" 17 | ] 18 | } 19 | ], 20 | "source": [ 21 | "people = ['Tom','Dick',\"Harry\"]\n", 22 | "for person in people:\n", 23 | " print(\"There's a person called \" + person)\n" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": { 30 | "collapsed": false 31 | }, 32 | "outputs": [ 33 | { 34 | "name": "stdout", 35 | "output_type": "stream", 36 | "text": [ 37 | "The first person is Tom\n" 38 | ] 39 | } 40 | ], 41 | "source": [ 42 | "print(\"The first person is \" + people[0])" 43 | ] 44 | } 45 | ], 46 | "metadata": { 47 | "kernelspec": { 48 | "display_name": "Python 3", 49 | "language": "python", 50 | "name": "python3" 51 | }, 52 | "language_info": { 53 | "codemirror_mode": { 54 | "name": "ipython", 55 | "version": 3 56 | }, 57 | "file_extension": ".py", 58 | "mimetype": "text/x-python", 59 | "name": "python", 60 | "nbconvert_exporter": "python", 61 | "pygments_lexer": "ipython3", 62 | "version": "3.6.6" 63 | } 64 | }, 65 | "nbformat": 4, 66 | "nbformat_minor": 2 67 | } 68 | -------------------------------------------------------------------------------- /Chapter 6 Pandas/Correlation Graph.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "" 12 | ] 13 | }, 14 | "execution_count": 3, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | }, 18 | { 19 | "data": { 20 | "image/png": "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\n", 21 | "text/plain": [ 22 | "
" 23 | ] 24 | }, 25 | "metadata": {}, 26 | "output_type": "display_data" 27 | } 28 | ], 29 | "source": [ 30 | "%matplotlib inline\n", 31 | "import pandas as pd \n", 32 | "\n", 33 | "def get_returns(file): \n", 34 | " \"\"\"\n", 35 | " This function get_data reads a data file from disk \n", 36 | " and returns percentage returns.\n", 37 | " \"\"\" \n", 38 | " return pd.read_csv(file + '.csv', index_col=0, parse_dates=True).pct_change()\n", 39 | "\n", 40 | "\n", 41 | "# Get the S&P time series from disk\n", 42 | "df = get_returns('SP500') \n", 43 | "\n", 44 | "# Add a column for the Nasdaq\n", 45 | "df['NDX'] = get_returns('NDX') \n", 46 | "\n", 47 | "# Calculate correlations, plot the last 200 data points.\n", 48 | "df['SP500'].rolling(50).corr(df['NDX'])[-200:].plot()\n" 49 | ] 50 | } 51 | ], 52 | "metadata": { 53 | "kernelspec": { 54 | "display_name": "Python [default]", 55 | "language": "python", 56 | "name": "python3" 57 | }, 58 | "language_info": { 59 | "codemirror_mode": { 60 | "name": "ipython", 61 | "version": 3 62 | }, 63 | "file_extension": ".py", 64 | "mimetype": "text/x-python", 65 | "name": "python", 66 | "nbconvert_exporter": "python", 67 | "pygments_lexer": "ipython3", 68 | "version": "3.6.6" 69 | } 70 | }, 71 | "nbformat": 4, 72 | "nbformat_minor": 2 73 | } 74 | -------------------------------------------------------------------------------- /Chapter 6 Pandas/Pandas Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 17, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "text/plain": [ 13 | "" 14 | ] 15 | }, 16 | "execution_count": 17, 17 | "metadata": {}, 18 | "output_type": "execute_result" 19 | }, 20 | { 21 | "data": { 22 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEACAYAAABVtcpZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd4VFX6wPHvmXSSEEIKLYQECL0E\nCUWpSkdF8IcCuoCVtXdXbCu6trV3XWyISlFBQAFpgiC99xJCCYEQICGkkTrn98edTGbIJJlAet7P\n8/A4c+65d86wy33nnvYqrTVCCCFqJ1NlN0AIIUTlkSAghBC1mAQBIYSoxSQICCFELSZBQAghajEJ\nAkIIUYtJEBBCiFpMgoAQQtRiEgSEEKIWkyAghBC1mGtlN6AkgYGBOiwsrLKbIYQQ1cbWrVvPaa2D\nnKlb5YNAWFgYW7ZsqexmCCFEtaGUOu5sXekOEkKIWkyCgBBC1GISBIQQohar8mMCjuTk5BAXF0dm\nZmZlN6VSeXp6EhISgpubW2U3RQhRTVXLIBAXF4evry9hYWEopSq7OZVCa01iYiJxcXGEh4dXdnOE\nENVUtewOyszMJCAgoNYGAAClFAEBAbX+aUiImkBrTdz5jEr57GoZBIBaHQDyyd+BEDXDH3tO0/u/\nK1kTfbbCP7vaBoHK9tprr9G+fXs6depEZGQkGzdupH///rRu3ZrOnTvTq1cvDh48CMAdd9xBeHg4\nkZGRREZGsmPHDsCI/o888ggtW7akU6dObNu2zXr97777joiICCIiIvjuu+8q5TsKISrGsUTjKeDP\nA2cq/LOr5ZhAZVu/fj2///4727Ztw8PDg3PnzpGdnQ3Ajz/+SFRUFFOnTuXpp59mwYIFALz99tuM\nHj3a7jqLFy8mOjqa6OhoNm7cyP3338/GjRtJSkri5ZdfZsuWLSil6Nq1KyNGjMDf37/Cv6sQovz5\nehq34rOpWVd0ndTMHP75/dZSnSNPApchPj6ewMBAPDw8AAgMDKRx48Z2dfr27cvhw4eLvc78+fOZ\nMGECSil69uxJcnIy8fHxLFmyhEGDBlG/fn38/f0ZNGgQf/zxR7l9HyFE5Vq2LwEAd5cruyWvPnSO\ndTGJpTqn2j8JvPzbXvadSinTa7ZrXJeXbmxf5PHBgwfzyiuv0KpVKwYOHMiYMWPo16+fXZ3ffvuN\njh07Wt8///zzvPLKKwwYMIA333wTDw8PTp48SdOmTa11QkJCOHnyZJHlQoia6VTyRQDm7TjJe2Mi\nK/Sz5UngMvj4+LB161amTp1KUFAQY8aMYdq0aQDcfvvtREZGsnbtWt555x0A3njjDQ4cOMDmzZtJ\nSkriv//9L2CMCVxKKVVkuRCiZkpKN7qTvT2u7Hf5gzO2lVzpEtX+SaC4X+zlycXFhf79+9O/f386\nduxoHbzNHxOw1ahRIwA8PDy48847rcEhJCSEEydOWOvFxcXRuHFjQkJCWLVqlV15//79y/cLCSEq\nRWxiBomWINCgrudlX2fDkdJ1A+WTJ4HLcPDgQaKjo63vd+zYQbNmzYqsHx8fDxi//OfNm0eHDh0A\nGDFiBNOnT0drzYYNG/Dz86NRo0YMGTKEpUuXcv78ec6fP8/SpUsZMmRI+X4pIUSlmLejoKs3N89s\nfT1zU2yJawdOJGXw7dqjAIydugGAiGCfUn1+iU8CSqmmwHSgIWAGpmqtP1RKzQZaW6rVA5K11pFK\nqTBgP3DQcmyD1vo+y7W6AtMAL2AR8Kh21PdRxaWlpfHwww+TnJyMq6srLVu2ZOrUqYVm/+S7/fbb\nOXv2LFprIiMj+eKLLwAYPnw4ixYtomXLltSpU4dvv/0WgPr16/Piiy/SrVs3AP79739Tv379ivly\nQogK9d6yQwA0qedFTp7mbGoW/d5eSUZ2Hi4mRczrw4s8t89bK63n5lv6eF9MTzr/+c50B+UCT2qt\ntymlfIGtSqllWusx+RWUUu8CF2zOidFaOxrd+ByYBGzACAJDgcXON7dq6Nq1K+vWrStUbtuFY+vP\nP/90WK6U4tNPP3V47K677uKuu+667DYKIaoHd1cT2blmOjSpy44TySzZe5qM7DwA8sxF/0ZOTCuY\nTjrJZlpoaccPS+wO0lrHa623WV6nYvzKb2LzgQq4FZhZ3HWUUo2Aulrr9ZZf/9OBkaVqrRBC1DDZ\nuWb6RAQS6ONBbp7mwsUcp87LH0zO52pS3N+/Rak/v1RjApauni7ARpviPkCC1jrapixcKbVdKfWX\nUqqPpawJEGdTJw6bYHLJ50xSSm1RSm05e7bil1ELIURFyJ/efuRsOh6uLmTnmgsFgQOnHU+BP5dm\nHwRyzZpgX49St8HpIKCU8gHmAI9prW1bNQ77p4B4IFRr3QV4ApihlKoLOHpGcfiso7WeqrWO0lpH\nBQU5lSZTCCGqnXUx5wD4ckIU7q4mUrNymbr6iF2dCxn2QSHufAZdXlnKuC834GpSPDW4lfVYsG/p\nZxc5FQSUUm4YAeBHrfVcm3JX4GZgdn6Z1jpLa51oeb0ViAFaYfzyD7G5bAhwqtQtFkKIGuLCxRxM\nCto09MXD1fHt+HiS/Qyh3v9dyXlLYMg1a5oHFcwGCvBxL3UbSgwClj7/r4H9Wuv3Ljk8EDigtY6z\nqR+klHKxvG4ORABHtNbxQKpSqqflmhOA+aVusRBC1BDJGTn4eblhMik83Bzfjv/1yy4AZm+OJf7C\nxULH63kVJJXy8yp9gilnZgf1AsYDu5VSOyxlz2mtFwFjKTwg3Bd4RSmVC+QB92mtkyzH7qdgiuhi\nquHMICGEKCvJF3OoV8f49e7h6uKwTs/m9UlMy+KZObvp0KQufl5uduMGUWEF08fbNqoL+0r329qZ\n2UF/a62V1rqT1jrS8meR5dgdWusvLqk/R2vdXmvdWWt9ldb6N5tjW7TWHbTWLbTWD1XHNQL5itpK\nOjQ01G7bh5EjR+LjY7944/3338fT05MLFy5celkhRC1wKvkiYZMX8tvOU9ZN47bHni9Ur2WwD/W9\n3UnJzAWMXUZdTYpx3UOtddxdTTzQvwXzH+wFGz6HnyaWqi3VftuIylDcVtL16tVj7dq19O7d27or\n6KVmzpxJt27d+PXXX7njjjsquPVCiMr205aC7WIOJqQCcNGyNsCWq0mRk6c5n2HcX1Izc8nIzqOu\npyvvj+lMqwa+APxrYHP48xVY9zFEDAF+drotsm3EZShuK+mxY8cya9YsAObOncvNN99sd25MTAxp\naWm8+uqrzJxZ7NIKIUQNtWBnwZyYd2/pDGA3JjB5WBt+vKcHbi4m0jJzeeAHY2O4/EVkfnXcGNUl\nhPaN/SAxBr681ggAXcbD2Bmlakv1fxJYPBlO7y7bazbsCMPeLPJwcVtJDxgwgHvvvZe8vDxmzZrF\n1KlT+c9//mM9d+bMmYwbN44+ffpw8OBBzpw5Q3BwcNm2XwhRZWXnmjlyNh2AY29eby13MRUEgXv7\nNMfFpNh90nGX8eiulomW5w7Dt8MgLxtu/R7a3ghlvWJYFFbcVtIuLi707t2b2bNnc/HiRcLCwuzO\nnTVrFmPHjsVkMnHzzTfz88/OP7YJIaq3nDwzrV5wPB8mqllB5kAXU/E38npe7pB0BL670QgAdyyE\ndiNKHQCgJjwJFPOLvTwVtZU0GF1Co0aNYsqUKXbn7Nq1i+joaAYNGgRAdnY2zZs358EHH6zIpgsh\nKkmKzayeX+672u7Y6K4hvLRgrxNX0bjtmA5LngOTK0yYBw07XHab5EngMpS0lXSfPn149tlnGTdu\nnN15M2fOZMqUKRw7doxjx45x6tQpTp48yfHjxyus7UKIypM/CAyW6Zw2Svr1H+zrQfsgNz7x+hL1\n+6PQtBtMWglNrrqiNkkQuAxpaWlMnDiRdu3a0alTJ/bt22f3q18pxVNPPUVgYKDdebNmzWLUqFF2\nZaNGjbIOJAsharasXCNfwOxJPQtlETOV0JUz0DuGhaYnuEH/Bf0mwz/mQkDpN4y7VPXvDqoEpd1K\nOi0tDYCjR48WOvbee5cuwhZC1DS5eWbWH0nkzm83A+DvXXh7h6KeBEyYmeiyhBcvzIB6TY3+/7Be\nZdY2CQJCCFGOzGbNgzO2sWRvgrXMUfYvRzGgt2k3L7tOo4UpHloMhFumgYdvmbZPuoOEEKKc5OaZ\naf7cIrsA8Mh1LR0mfskv6xZmmSW0/Ud+cH/DOCf7Ibj9lzIPACBPAkIIUW52xhWe5//AtS2LrL/8\niX408vOEw8thwUPQrBcNRs9giqnOZU3/dEa1DQJa61KnUatpqvHWS0LUeOtjEhn35Qbr+xn39ODP\nA2fwdHO8URwYewURvRx+Gg9BbWDcTHw8/cq1ndUyCHh6epKYmEhAQECtDQRaaxITE/H0LH0SCSFE\n+csPAB6uJmbc25Ouzfy5pmVg8SftnA2//hMCI2D8r1DOAQCcCAJKqaYY+YAbAmZgqtb6Q6XUFOBe\nID//Y/720iilngXuxthK+hGt9RJL+VDgQ8AF+EprfVkrvUJCQoiLi6O2p5709PQkJCSk5IpCiArX\nsK4np1My2fnS4GJ//VttnQa/PQpNe8BtP4FXvXJvIzj3JJALPKm13qaU8gW2KqWWWY69r7V+x7ay\nUqodRp6B9kBjYLlSKj//2afAIIwsY5uVUgu01vtK22g3NzfCw8NLe5oQQlSIE0kZnE7J5IXr2zoX\nAJKOwNIXIfRqGD8P3CruCb/EIGDJCBZveZ2qlNpPEQniLW4CZmmts4CjSqnDQHfLscNa6yMASqlZ\nlrqlDgJCCFFVpWTmMPSD1QBc06KE7h8ArWHhU8YeQCM+qdAAAKWcIqqUCgO6ABstRQ8ppXYppb5R\nSuXvftQEOGFzWpylrKhyIYSoMTpNWUq6Zcvn5kHeJZ/wx2SIWQH9J0Ng0TOHyovTQUAp5YORbP4x\nrXUK8DnQAojEeFJ4N7+qg9N1MeWOPmuSUmqLUmpLbe/3F0JUbdm5ZpLSjaQveeaCW9rAtsEldwWt\n/Qg2fgGdxsI1j5ZnM4vk1OwgpZQbRgD4UWs9F0BrnWBz/Evgd8vbOKCpzekhQH4GhaLK7WitpwJT\nAaKiomQepBCiyjl8Jo2B7/1lfb//laGM/HQtAG/c3NEuBWQh5jz4/THYNh1aDoKbPgFT5azdLfFT\nlTEH82tgv9b6PZvyRjbVRgF7LK8XAGOVUh5KqXAgAtgEbAYilFLhSil3jMHjBWXzNYQQomK9v+yQ\n3fu2//7DuktoWEAx3UC5WfDLXUYA6HE/3DYbXNzKs6nFcib09ALGA9cppXZY/gwH3lJK7VZK7QKu\nBR4H0FrvBX7CGPD9A3hQa52ntc4FHgKWAPuBnyx1hRCiWlh7+BxTFuwlMyePP/aeBuCRARGF6rVr\nXLdQGQCZF+D7m2HfPBjwEgx9A0xOzB4qR87MDvobx/35i4o55zXgNQfli4o7TwghqqKs3Dx+2nyC\nF+cbv1uPJaaTZ9ZMubEdF3PMdnV/+ufV+Hk5+GWfGAM/3gLnj8JNn0KXf1RE00tULVcMCyFERdpy\n7Lw1AACsOmhMWAkL9C50w+8eXr/wBRL2wncjQOfBxN/LdCvoKyW7iAohRAmW7UtwWB4W4E2XUH8m\nD2sDwNLH+xaudGqHkQtYmeDOxVUqAIAEASGEKNbxxHSmrTsGwM5/D+b2HgWzfsICjQHge3qHs/G5\nAbRqcMlWz7EbYNoN4OppJIMJbltRzXaadAcJIWq1bbHnOZyQxq3dmtqVZ+Xm0fqFP6zvb+8Ril8d\nN14b1ZE+EYH41ynIDubqYqJB3UtW+kYvg58mgncgTPwN/JtRFUkQEELUajd/ZqSK3XPqAg9fF0GQ\nrweZOXm0efEPu3r39SvI5zu0QyOKtfF/xkrgoDbwjzlQt3GZt7usSHeQEEIA09cf5/avNpCZk0fc\n+YxCx5vU8yr5IlrDqjdh8b+gxXXGGEAVDgAgQUAIUYv9dch+W5pDCWm0efEPth4/DxjTPfOZikgE\nb5VzEX6aAKvegI63wLhZFbYd9JWQ7iAhRK018ZtNDsufmbMbwEj1CLiWFACy0+GH0RC7Dvo/B32f\nrrRtIEpLgoAQolbKyM4FINDHgy0vDKT5swsxX7JTWYO6nqz517V4exRzq8y5CLNugxMb4KbPoMvt\n5djqslc9QpUQQpSx+AuZADw12Mh5tfCRPrRp6MvQ9g2tddxdTTStX4f63u4Or0FeDsy6HY6sghs+\nqHYBAORJQAhRS+09lQJAm0bGPj9tG9Xlj8f6cvpCJhk5ebx3a+fiL5CbDXPuMnIBDHsbuk4s7yaX\nCwkCQohaadeJZDxcTXRsYp/MvaGfJ9Pv6l7EWRb5O4Ee+B0Gvgw9JpVjS8uXBAEhRK2SnpXLte+s\n4kxqFu6uJlxKGvS91Pnj8PNEOLUdBr0CvSonGUxZcSafQFOl1Eql1H6l1F6l1KOW8reVUgcs6SV/\nVUrVs5SHKaUu2mw7/YXNtbpatp8+rJT6yJKrQAghKoTWmhPnMziTmgVAU38n5v7bitsKXw+Cc4fh\n/76u9gEAnHsSyAWe1FpvU0r5AluVUsuAZcCzWutcpdR/gWeBZyznxGitIx1c63NgErABY0vpocDi\nK/0SQghRlISUTL74K4aIYF+e+3W33bHpd/dw/kI7Z8Fvj0Gd+nDnImjUqYxbWjmcyScQj5FDGK11\nqlJqP9BEa73UptoGYHRx17FkIqurtV5veT8dGIkEASFEOerx+gqH5R+OjXRuFXB6Iix8HPbNh5Du\nMOYH8G1Qxq2sPKUaE1BKhQFdgI2XHLoLmG3zPlwptR1IAV7QWq8BmmDkH84XZykTQogK0791EIlp\n2dzYyYntHKKXwbwHICPRWADW75lKTQVZHpwOAkopH4xk849prVNsyp/H6DL60VIUD4RqrROVUl2B\neUqp9jjOTuYwibxSahJGtxGhocUkaxZCiFL6ZmK3kreAyMuBFS/Duo8hsDX84xdoVMKU0WrKqSCg\nlHLDCAA/aq3n2pRPBG4ABmitNYDWOgvIsrzeqpSKAVph/PIPsblsCHDK0edpracCUwGioqIcBgoh\nhChJZk4eULAgLCM7r+QAkHIKfr4DTmyELuNh+NvgVsoB5GqkxCBgmcHzNbBfa/2eTflQjIHgflrr\nDJvyICBJa52nlGoORABHtNZJSqlUpVRPjO6kCcDHZft1hBDCoLVmxf4zAPh5uTH+6rCST0rYa+QB\nzkisUnmAy5MzTwK9gPHAbqXUDkvZc8BHgAewzDLTc4PW+j6gL/CKUioXyAPu01onWc67H5gGeGEM\nCMugsBCiXMzZdpKnft4JgH9R2z7Y2v87zLvfyAJ252JoclU5t7BqcGZ20N847s9fVET9ORhdR46O\nbQE6lKaBQghhKzMnj4SUTJoFeBdbL387aIAOjf2KqQls+hIWPQ0NO8At30FAi+Lr1yCyYlgIUW0c\nPJ3KkA9WW9+HB3ozdXxXmgf52K38zcjOZeamWMDYBK5ZQJ2iL7rxf0YSmJYD4dbp4F58cKlpJAgI\nIaq8S/P95jt6Lp1B7xtB4c8n+9E8yAeAb/4+CoC7i4l9Lw/B4eYE5jxY+iJs+NQIAGNngKtH+X2J\nKkq2khZCVHmdX15q935I+8KLta579y++X38MgHeWHgLgt4d74+ri4DZ3Zj98O9wIAFdNgLEza2UA\nAHkSEEJUA5k5ZuvrlsE+fPGPrpxNzaL7JauBX5y/l22xydb3rRr42F8oJxPWfwJ/vWVM+xzxiTED\nqBZvYyZBQAhRpZnNGi83F8Z2b8pTg1vjYlIopYrM9vXr9pMA3HFNmH030JFVsHgynN0PLQcZU0Br\n0PYPl0u6g4SopfbHpxA2eSHPzjU2VTt6Lp3DZ9LIyM7lX7/sZPOxpBKuUDG2HD/PxZw8Ojbxw9vD\nFU83FwBcXQpu8G+PLryZW0D+tNC8XFj4JEy/CTKTjb7/f/wiAcBCngSEqKH+2HOaR2ZtZ+7919DB\nJnHKF3/F8ObiA9b3MzfFYlLw40ZjNs1H47rw05Y4zmfk0C2sfomfk2fWpd+TvwRbj5/n3/P38ML1\n7azB6NK2uNv09Y/uGkLLYB8mfb+Vs5Ztouv7uBvdP3PuNpK/dJ9kJIBxL2amUC2kLLs9VFlRUVF6\ny5Ytld0MIaqV9Kxc2r+0xPo+0MeDj8ZF8vOWOGt3SVEeGRDBRyuiAWgR5M3g9g15dECE9Re4rTXR\nZxn/9SYWP9qHBnU92XvqAn0igkrV1pw8Myv2JzCkfUOUUuSZNS2eK7wMafPzAwnyLXnwtv/bKzmW\nmMFXYyIYuPMJOLbGuPn3fqxU7arOlFJbtdZRztSVJwEhqrnz6dnEnE0jyuaX8qOzttvVOZeWxW1f\nXrr5r2PrY85ZX8ecTefzVTF4uJp4bGCrQnU/XG4Ei5mbYpm+/jgA+14ZQh13528tn648zAfLo4kI\n9mHZE/144qcdDuvVcS8chBwxKUUDkrh69QS4EA0jP4fI25xuT20jYwJCVHMD3/uL0V+s50xKprVs\nnyWJekm9NPMe7MWTg+xv7puPFay0VZhpq47jkRrr8PwtllW5+QEA4Jk5u0nOyLZrT3E+sASS6DNp\nDPtwDSsPnHFYr6iB4Etd53mA+R4v4pVyxJj6KQGgWPIkIEQ1NP7rjayJPodJgdnSo3sy+SLBdT0B\nOJ+Rwz29w/nKsmjqUl5uLlzMyaNziB9ebi68u+xQoTrd1X5ed/ualqZTsBM41RZaXAftRkDTHvwV\nXfDE4EYufqSTjQu/7TzJbzuNDYKPvXl9kd/hwsUc7v9hq13Z/ngjeA1oE8wKm2Dwxs0di/8LMZvh\n+FrYM4cXzn3LBa8Q1IRfoXGX4s8TEgSEqG6OJ6azxnIDNtsM6Y36bB3e7i5k5ZrJNWvq+7jTq2UA\naw8n2p1/6Y25dUNfDvxnKHHnM7j5vcV0MR3mDpc/uNZlJ2neTZmSfh89mrgzzH0HbP7KWGDl04Cm\nbhF86ZZBB9MxGqmCmURJ2odYHUyi9oPNpyHydnDzLPQ93llykHUxiYXKwRjDGNWliXX8IjzQwVYO\nmSlw9C84uhoO/gEXYkG5QPd/4jfwpVq3/cPlkiAgRDXz2cqYIo+lZ+dZX5vNmjHdQu2CwPS7uhc+\nKTUBz12zCd87j12exi/zNJMvmdc8i0/vB1j83iYu+gczbPR/ICvV2G0z5k/qxmylqcrmQnA3Zp7y\n5Tw+eJBDc3WKJiqRFuoULHwCVr8Ng1+FDv9nXZS1Yn8C328o6EKacmM7pvy2z/o++WI2/xsfZQ0C\n1kHpi8mw7Tvjph+3Ccy54OYNTbvDwJcgYjB41i39X2otJkFAiGokNjGD2VtOANAnItD6ROBIr5aB\nJKVnA3BNiwC+GN+Vup42qREvnoc/XzNuqnnZuDTsROrVT3PfX67cM24c13ZsBoCHqwvZeZYVux6+\nEDkOIsfx1LebWJV0lifbtOKjE4doUs+Lk8kXbVqgOXinJx4rXzamae6bD8PfAd8GfLLysF1bg3w9\nefGGdvzndyMQtAy2X+nracqF5VNg01eQnQqNIuHqByFiiBEAaljKx4rkTFKZpsB0oCFgBqZqrT9U\nStXHyCscBhwDbtVan7ckofkQGA5kAHdorbdZrjUReMFy6Ve11t+V7dcRomZ7Z+lBAD4e14W52+KK\nrBfs60GXUH/yzJqnBrdifM8wIwBoDae2GTfTvb9CXjZ0Hge9H4fAlvgCPw6xv5a7q4ms3Dy7srOp\nWaw6eBYw+vYBxl/djG3Hz7N0X4KlluKYXw9a3/unsVXD8pcheinmqHtIPtUKCCAswJvu4fUZ2C4Y\nD1cXbuzUiJmbTvDwdS0B8OYifU27CFvwDiRsM54mej0GjQovDhOXx5kngVzgSa31NqWUL7BVKbUM\nuANYobV+Uyk1GZiMkWlsGEY2sQigB/A50MMSNF4CojByC29VSi3QWp8v9IlCCM6nZ5OZm0cjPyO1\n4b5TKSzYeQpXk+LGzo1xNSlWWm7El3K1TAtyMSkeui7C6D/f8j1s/xFObgF3H+g8FrrdY+yhXwwP\nVxNZNnv3ANZ1BAA9mwfw1d9Hubp5ACv2J9jVm7kplikj2htBptUwWP02auNnrHQ1k+riha93OGSH\nwh+Nwa0OwX5NebRJEziwHw4v42+PufirNPJSg+D/voaOo0v99yiK50xSmXiM5PForVOVUvuBJsBN\nQH9Lte+AVRhB4CZguiXn8AalVD2lVCNL3WX5WcYsgWQoMLMMv48Q1d709cf49/y91vcxrw/HxaTY\nFWdsjHZ1iwAA2jQquu/71AXL9Mz0RFj7vpE0JTcTAlvBsLeMAOBZQqIVCw9XE1m59kEgvz//jmvC\nGNiuAXtfHoK3hytD2je0m2L6+654IwgABLeB0V/zrnksGTvnM7p5Lu3qXIDkExC3GbIzINemO8nk\nylrdjZk5/fnkyUfw95WVvuWhVGMCSqkwoAtGjuAGlgCB1jpeKRVsqdYEOGFzWpylrKhyR58zCZgE\nEBoaWpomClHtaK2JO3+RpvXrsPV4kl0AAHj65528NyaS1MxcAD65zUh7WL9OQcrE+/u34PNVBQPG\n17YOgujlMP9BSEuATrdCt3shJKrUO2Z6uLqwKy6Z8+nZ/PP7rbxwQ1vrse7hxgK1/Dn89/Rpjq+n\nK17urrw0fw9DO9jvz5OamcMn27KBYfzzlgFQ12bWkNaQfg5STgIa6jVjx5+nWfv3Ubw8a+c2zxXB\n6SCglPLBSBv5mNY6xWGSBktVB2W6mPLChVpPBaaCsW2Es20UojpZdfAMT/28i3Npxl430+7sxss2\nM2Tyzd1+kvfGRFoHU30tN1y/OgWDoc8MbYOPhysJKZk00Ince/ET+HG+8cv/tllXNF/+fEY2KZm5\nPDJrO5uOJTHik7XWY9e1CS5Uf0w344fbm4v2220BDXDkbLr1daHFX0qBT5Dxx+K54f48PqiVwy0r\nRNlwasWwUsoNIwD8qLWeaylOsHTzYPlv/sqOOKCpzekhwKliyoWolX7fFW8NAADfrD1GkK8HAd7u\n7Hl5CKO7hliPLd17mtRMYwDWVMQy4Ae71+MV33k8uPsW3KMXQe8n4J+rr3jBVGaOMSh86Uykp4e0\nLvbm7OnmYj03X4rlOwD4OLFZf0nFAAAgAElEQVQC2GQqestoUTacmR2kgK+B/Vrr92wOLQAmAm9a\n/jvfpvwhpdQsjIHhC5buoiXA60opf0u9wcCzZfM1hKheHpu1nXk77H8DJVzI5GBCKuO6h+Lj4co7\nt3Tml63GDKBJ3291dBm+u6s7ualnYfEzsPU7o0+93UgY9DL4h5VJW4sKOrfYBClHjCBg/ySQYVnH\n8PvDvcukbeLKORNiewHjgd1KqfydnZ7DuPn/pJS6G4gFbrEcW4QxPfQwxhTROwG01klKqf8Amy31\nXskfJBaitsjMyeOuaZsdrpQ9mJAKQIi/l7VsROfGLNhZECz6RAQWnJCdTr/4abD+Y8hOh05jodcj\nENS6TNvs4qDrVymo7+3uoHYBTzdToSeBf1qCmZeTm8GJ8ufM7KC/cdyfDzDAQX0NPFjEtb4BvilN\nA4WoSQ6fSbMLAAdfHYqHqwsPztjGwl3xQMHsH4B7+zS3CwK9WlqCQOwGmHc/JB0xsmQN/g8EFwzY\nliVHuQJMSjnO3WsjJTOXbbHJfLXmCN+uPcYzw9pYjzm7I6gof9LZJkQFWm4zj375E33xcDVuhvkB\nACA8oGDPm44h9tM4j55JM6Z7Lnoa6jaG8fOgxbXl2maTzZNAl9B6bI9NJs9c8nyNw2fSAHh14X4A\nJs/ZZT3mzHiAqBiylbQQFURrbd02+asJUbQM9rUe+3JCQf4P/0u6WR6xrJ5tSCIv5H4Ei56ClgPh\nwY3lHgDA/klgwtXNnD4v0Md+Wmf+eEB4oDe+nrLNQ1UhQUCICpBn1qzYb0ygG9e9KQPb2c+fH2R5\n36qB/Z45pJ3l2hMfs9j9GTZ4PoxP9Hzo8xTc9pOxj08FsB0Y7tk8oJia9ibbdP/YWvp43ytukyg7\n8kwmRDnYcSKZc6lZ1pv9Ez/tYL5lNtBzwx333a9/9rqCbhJzHmz+Gv58lU7Z6azTbXgr5xqeePRp\nXIMjKuQ75MvP5/7LfVdTz6v4wWBbnm6Ff2N2beaPWwljCaJiSRAQooxk55pZuu80fVsFMfJTY0HV\nj/f04Pav7NM6FtUVkr9HEHFbjCmfJ7dAWB+2tH+e8XOMiXT/quAAAFgHgHPytMMbe1GimhVOUt/Q\nr3BeAVG5JAgIUUY+WH6Iz1bZ7/V/aQAoVm4WrP0QVr0JXv5w02cQeRs+8SnA32Xb2FLwcDVu/Nl5\nZpRS/LNfc7qHFb7BX8rRDd920FtUDRIEhCgDWutCAcCRX+672vGBE5tg3gOQGA1tR8CNH0Id40bb\nzrJRXEAJ8/LLy4Srw1gTfY42DY0xiGeHOT8VNbR+HWKTMgjwdicxPZvQANkErqqRICBEKZjNmhfm\n78G/jhsr9p/htVEd6drMn11xF4o854H+LXh6SGuK3G/r4GKYPR7qNoLbf4GIQXaHlVJ8PTGKEP/K\nuYEOateg2FzBxfns9quYtTmWhJQslu1LKLR4TFQ+GaERohRmbo5lxsZYPl0Zw4HTqfzf5+vYFZfM\nTZ+utatnu7HaLVFNHQcArY05/7P/AUFt4N5VhQJAvgFtG9C6YcXMBipLHZr48erIjjS2dA0lZ+SU\ncIaoaPIkIEQp/LHntN17TzeTXdmm5wdwJiWLDk38CJu8EDCyfBWSmw2//hP2zoXwvnDr9+BVr1zb\nXpkiGhgBrKStJkTFkyAghBO01pxLy2ZN9DkGtWvAMksKRV9PN+v8/1VP9SfY15NgX/sB0UK7YGan\nG7/+Y/6EfpOh79PgUrP/Kd7WPRRfT1du6NS4spsiLlGz/58nxBVKz8pl5KdribZsgQAQ1cyfN27u\nyOOzd7DzRDImk6JBXQ/CAu1nvnx2+1V2Wy4AkHkBZoyF2PVw/btGesdawGRS3BTpMIeUqGQSBIQo\nxuS5u+0CAEBUWH0CfTyICPZlTfQ5UuJTuPmqwje44R0bFbzRGvbMgeVTjMxZo/4HnceUc+uFKFmJ\nA8NKqW+UUmeUUntsymYrpXZY/hzL32JaKRWmlLpoc+wLm3O6KqV2K6UOK6U+UsWkJhOiqljvYMtn\nY6NcOGuTEKZvRFChelbnouGHm2HO3eDuDRN/kwAgqgxnZgdNw0gIb6W1HqO1jtRaR2JkHJtrczgm\n/5jW+j6b8s8x8gZHWP7YXVOIquTouXTCJi+0Zv6acW8P67EOTYydPf99Qztrma+ng4fqvFxY8x58\nfo2xCnjom3D/OgiThCqi6nAmn8BqS4L5Qiy/5m8FrivuGpb0k3W11ust76cDI4HFpWyvEBVi1GcF\nUz4HtAnmmhaBrJt8Ha4uyppSMchm1k8d90v+KaUmwM93QOw6iBgCN35gbP0sRBVzpWMCfYAErXW0\nTVm4Umo7kAK8oLVeAzTByDGcL85SJkSVk5SebTef/c5e4QA0rudV1CnYdW4eXQ1z7oXMZLjxI+g6\nsbyaKsQVu9IgMA6YafM+HgjVWicqpboC85RS7XGcmazIrBRKqUkYXUeEhoZeYROFKJ3Fe4wEL6H1\n6xDZtB7dwv2LrDuwbTDL958x9tLJyYRVr8O6j6FeM7htNjSOrKhmC3FZLjsIKKVcgZuBrvllWuss\nIMvyeqtSKgZohfHL3zYrdQhgn2XbhtZ6KjAVICoqquQURkJcoeiEVD5bFcMbN3e0PgUsfbyvteun\nKJ/cdhVJ6dmY4jbB/AeNvX863wbD/guedSui6UJckSvZNmIgcEBrbe3mUUoFKaVcLK+bYwwAH9Fa\nxwOpSqmelnGECcD8K/hsIa7I9tjzpGflWt9/uCKaX7ef5O/oc2w8amzbXFIAAPDUmTRe92/4ZjBk\npcJtP8OozyUAiGqjxCcBpdRMoD8QqJSKA17SWn8NjMW+KwigL/CKUioXyAPu01onWY7djzHTyAtj\nQFgGhUWliE3MYNRn62hY15MNzw0ACvLo/r7rFKsPnXXuQkfXwIKH4PwxiLobBr4Enn4lniZEVeLM\n7KBxRZTf4aBsDsaUUUf1twAdStk+IcrU/B0neXTWDgBOp2Ty6/Y4RkY2YcFOo3dy3o4ieyntrfsE\nlj4Pfk1hwgJo3q+8mixEuZIVw6LWuHAxxxoA8n3z9zE6NC786/2t0Z0cXyQ7A5Y8B1u/hVbD4P++\nAg8fx3WFqAZkK2lRI328IppHZ223ru4F2Hw0yfr6l/uuJjzQGzcXRWxSBgDv3tLZeryuoxSQ5w7D\n//rA1mlwzSMw5gcJAKLakycBUePk5pl5d9khAPbHp7Dgod7kmjWnLlwEYMOzA2jo54m3hwvbYpO5\n+7stAAxs24CRkY0tXUKXTEo7sQlmjDESwE+YB837V9wXEqIcSRAQNc6xxAzr60MJabR58Q8A7uvX\nAjcXZd3ff8/JFGs9Hw9X/Oq4MaZbKBuOJBHZ1GZtwJZvYfG/wLcRjP8VAlpUzBcRogJId5Cocf73\nl+Ncv9EJqTSu54XJZMwEen1UR+uxfq2MDeCubhHAhueMJwXMZlj+Mvz+mLHfzz0rJACIGkeCgKhx\nft5qLF25sbP9Xj1rDp+jf6uC3T5v6xFKoI/xVHBfv0tu7nk5MPce+Ps96DwOxs0Gn2J2ChWimpLu\nIFGjnLAM8nZs4se7t3Tmt50FUz6zc820uiRP79/PXEtWjhm/OjYDwZkX4KcJcGQV9H8W+j1zyeZA\nQtQcEgREjbLKstBryoh2uLsWftAd1LaB3XtPNxf7lcEpp2DmOEjYAze8D1F3lWt7hahsEgREjTBn\naxxvLN7PubRsAEL86wBw6NVhPDRjG0v3JdAsoA7BdT2LvsiJzTDrNuNJYOwMaDWkIpouRKWSICBq\nhBfn7yEjO8/63s/L6N5xdzUZg7yAi6mYLp3o5UYA8G1gzABqKIvbRe0gA8Oi2jKbNQdOpxA2eaFd\nALi+YyO7Lp6Hr4sAMLZ7vpTWsPU7mDkW6ofD3cskAIhaRZ4ERLX1+E87mO9gr58Xbmhr9z7I14PF\nj/YhPNDbvmLORVj4FOz4AZr1MlYA13EQKISowSQIiGpJa+0wAAA08iucAaxto0u2dk6ONbp/Tu+G\nXo/BgH+DqeSto4WoaUrsDlJKfaOUOqOU2mNTNkUpdVIptcPyZ7jNsWeVUoeVUgeVUkNsyodayg4r\npSaX/VcRtcWp5Iss3nPa+r5VAx+iXxsGUPjXviNHV8P/+sL548av/0EvSwAQtZYzTwLTgE+A6ZeU\nv6+1fse2QCnVDiPPQHugMbBcKdXKcvhTYBBGlrHNSqkFWut9V9B2UQudTc3imjf/tL7/+b6r6Wbp\n6z/06rDip/ObzbD6LfjrLagXCuNmQXCbcm6xEFWbM/kEViulwpy83k3ALEuayaNKqcNAd8uxw1rr\nIwBKqVmWuhIEhNMW747n/h+32ZV1bFKwDbSjdQGAMfi7bx6s/RBObYeOt8D170oCGCG4stlBDyml\ndlm6i/J322oCnLCpE2cpK6pcCKekZuYUCgDgRArIlHiYcSv8fAdkpcGIj+HmLyUACGFxuUHgc6AF\nEAnEA+9ayh09jOtiyh1SSk1SSm1RSm05e9bJVH+iRpu77aT19fCODQFwcymm70dr2PUzfNELjvwF\nQ16HBzbAVRNkCwghbFzW7CCtdUL+a6XUl8DvlrdxQFObqiFA/hSOosodXX8qMBUgKiqqyGAhaoc8\ns+a9ZYfoHlafd27pTKN6nhyIX83jg1o5PkFrWPI8bPgUGnYysn8Fta7YRgtRTVxWEFBKNdJax1ve\njgLyZw4tAGYopd7DGBiOADZhPAlEKKXCgZMYg8e3XUnDRfUVnZDK0n0J3NMnnLTMXNxdTfg6yuQF\nnEvLIurV5QAMbt+A0ABjO4g/n+rv+OLZGTD/Adj7K3S9E4a/Ay4yE1qIopT4r0MpNRPoDwQqpeKA\nl4D+SqlIjC6dY8A/AbTWe5VSP2EM+OYCD2qt8yzXeQhYArgA32it95b5txHVwttLDrJ0XwJvLzlo\nLfv0tqu4vlOjQnUfs8kJfFuP0OIvnLAX5k4y/nvtC9D3Ken6EaIEzswOGueg+Oti6r8GvOagfBGw\nqFStEzWSm0vhoai/Dp0pFATCJi+0vv72zm7UcS/i/65aw6YvYekL4OYF42ZC62Fl2mYhaip5ThYV\nKjohlYW74wuVrzx4luiEVFoG+6CU4sLFHOuxAG93rm0d7PiCqafh1/vgyEoI72f0//sUUVcIUYhs\nICdKJTUzhz/2nCYzJ6/kyjayc82sPHCGnXEXAGNOf4/wgn16zqZmMej91czbcZK0rFw6v7zUeizZ\nJiDYiV4On/eC2A0w5A0YP08CgBClJE8Cwmn741MY9uEaAO7v34JnhrbhRFIGTevXKfHcqatjeGfp\nIev73x/uTasGvqRk5jDi47+tyeE3xCTx+OyddufmmW0miGkNJ7fC9u9h6zQIbg+jv5GVv0JcJnkS\nEE7LDwBg7N8z/uuN9HlrJb9YcvoW5ei5dLsAABDsa+T2revpxt19mlvLZ28pWFM4rrsxEOzuoiAx\nxuj3/19f+GoAbP8Ruk+Ce1dIABDiCsiTgHBKfu7efLY7eB49l1bkeYlpWQx87y8ARkY2Zt6OU0zq\n25x6ddytdcb3bMaNnRrR5ZUlNCKJcFM8U7qZiVALeabBVupmxMHHls9o2MnY8qH9zbLtsxBlQIKA\nKFFqZg7frD0KwI2dG5OQksmmo0nW445m++w9dYE67q5c+84qa9kHY7vwwdgu9hW1hv2/UXfHDLZ5\nrMFfWW72OwGfBtRr0AEC+kJwO2jaA4LbyrRPIcqQBIFqIjfPzMLd8Qxo2wAfj4r7n+1CRg6dXykY\npJ1wdTO++fuoXZ0Plkfz2MCC1bt5Zs31H/1d8sXPHoL5D0LcJkx+TVlhvopt5gg6dryKcTcOA++A\nMvseQgjHZEygmliyN4FHZ+2gw0tL2G2ZYZMvMyeP7zcctx9ALQOXBgCAq0L9rat2bZ1MvghAzNk0\nWjxXeDnI88Ntsn2Z82D9p0b/fmI03PA+PLqTfd3/y4y8ASQ16CkBQIgKIkGgCjmfns07Sw46nH55\n8HSK9fWNn/zN3dM2s/mY0SXzzJxdvDhvD9d/tIbv1x8rk7bk5pkLBQAwkrU/PrAVH4yJ5Ogbw3nz\n5o4ArI0+B8BnK2McXu/evpbB3+RYY1fPJc9BWG+472+IugtMLtzaLQRfT1dGdG5cJt9BCFEy6Q6q\nQvq9vZKUzFzWH0nkgzGRNK7nRY/Xl9PQz5M9J1Ps6q44cIb4C5kserSPdZD2wOlUXpy/l7HdQx32\n05fGcZuB4GeHtSEpPdv6BODp5sLILsZO4KO7hjDlt70s259AzLk0th5Pcng9Uk/D6reNaZ0oY15/\nz/vt+vfbNKzL7ilDHJ8vhCgXEgSqiO2x50nJzAVg6/Hz9HlrJR+MieRcWjbn0rIBaFLPi5w8M2dS\nswAID/LG7KAL6FTyRZoFOJFmsQh5Zs2Ad40ZPd/f3Z0+EUFF1nV1MdGuUV2W7UsodOxfQ1vTLUjT\n5sAn8P5EQMNVE+Gah6F++GW3TwhRdiQIVBH/+GpjobLHZu+we//aqA70axVE8+cWobWxNWtKZuHV\ntMkZOTS7gi7195cVzOlvWNfzMq+ieSBwFyx4FLLTjX38ez0C9ZuXfKoQosLImEAlO5+ezZerj5Ce\nbYwDOJr92N2yvUKIfx2UUmx7YRBhAXVITMtmXUxi4WtmZF92e/LMmm8t00Hv6R1O8yCfEs85nljQ\ndWTCzMedjrM35L/wy51QrxncvxZu/EACgBBVkDwJVLIu/1lmfX1fvxY8NjCC33ae4ulfdgHQI7w+\nsyb15FhiBuGBRhePv7c7V4X6M3f7SdYfMYLAt3d2o64pm5nTPsJ77Qo43Qi86oF3INQJAO9gCGgJ\nLq5sPJJIswBvGvoV/pX/2crDpGfnEezrwQs3tHPqO4zuGsLs1Tu51rSDB1wXEHHoJPiHw/XvGU8A\nLo5zBQghKp8z+QS+AW4AzmitO1jK3gZuBLKBGOBOrXWyJSH9fiB/o/gNWuv7LOd0BaYBXhhbSj+q\nta7VWcPeW2a/lULzQG883Vy4JaqpNQh8MDYSpZQ1AOQL8ClYcasw0yLuV0J3fEBXt1OYYxXEOvir\ndfeFZtewfr83v2k/bht2Le26DwR349pZuXm8a2nTj/f0KLrhuVlGwvaEPXByG5MTY3jGZxem3AyO\nmBsae/m0GwmmEvL/CiEqnTNPAtOAT4DpNmXLgGe11rlKqf8CzwLPWI7FaK0jHVznc2ASsAEjCAwF\nFl9mu6u9jOxcPloRDUCQrwftGtXlhs6Fk6oU1Sf/2MBWfLnmKD1N+3jJ9TtC15yARpG8YHqIDXlt\nWP5YH7h4HjLOQUaikXD9xAb00TU85mp8Lsu/hb/qcDGkN+lN+/GPZS40wYvBHUOI8M6Ei7lgcgOT\nK2SlwLlo2DMH9s41rg3gVR/VoD10HsOXqT1p2rE3zTuElMvfmRCi7DmTVGa15Re+bZntBPINwOji\nrqGUagTU1Vqvt7yfDoyklgaBM6mZdH9tBQCdQvz49YFeuJgcb4WgitgiwZuLLGn+M61P/cpFr0Yw\n9H/QaQw/PLsIyARXd/BtYPzJ13kMR8+mMfjdFdQnlTamWJ4PPYZXzJ+EHl3KHx6WetHAO0U03tUL\n2gyH9qOgcRfwbQwmEwq493L+MoQQlaosxgTuAmbbvA9XSm0HUoAXtNZrgCYYSejzxVnKHFJKTcJ4\naiA0tISUgtVMWlYuQ95fDUDrBr7Muf8ahwFg3oO9SC5qgPfAQlj0NK1TTkLPB/G69jnwMAZwfT1d\nSbVMNXVk0vdbycWVM/hzxuzP6kOdgRGEqjNEqhg8VDZvj2prrOrNywFzDphzwaMu1G0M4X3Bw/eK\n/x6EEFXDFQUBpdTzGLmEf7QUxQOhWutEyxjAPKVUe4zZjJcqcjxAaz0VmAoQFRVV7ccNMnPycHMx\n4WJSzNt+kvMZxrTOPx7rU+Qv/cim9QoXZqfD4meMvfQDW8MdC41VtzYmXh3G53/FoLV2eO3DZxzt\n+KmI1Q2I1Q3Y+/IQqMC9iYQQleuy/7UrpSZiDBgPyB/g1VpnAVmW11uVUjFAK4xf/rYdxSHAKaqo\nMymZxCVf5KpQ/zK53g0f/83hM2nsnjKYF+btAWDxo0UHAIdSTsHMcRC/A65+CAa8ZHT5XMLTzUSe\nWZOTp9kWm4SbiwlfT1cign1YdehsiR/jLQFAiFrlsv7FK6WGYgwE99NaZ9iUBwFJWus8pVRzIAI4\norVOUkqlKqV6AhuBCcDHV978srfpaBK3/m89APMf7EVnR7/IS0Frbf31PceSfGVc91DaNqrr/EVi\nVsLPEyE3G8b8CG1vKLKqp5sxI+dQQipjp26wlj90bUs2HbPf0qFNQ18OnE51vh1CiBqnxMViSqmZ\nwHqgtVIqTil1N8ZsIV9gmVJqh1LqC0v1vsAupdRO4BfgPq11/p3nfuAr4DDGtNIqOSh817TN1tc3\nfbr2iq+XnFGwonfKb/sAGNahoXMnaw3rPoYf/g98GsK9fxYbAKAgCNzwsf1Wzt+tO2aXA+DYm9fT\nPMiYGtqmodHH71rE4LQQouZyZnbQOAfFXxdRdw4wp4hjW4AOpWpdBdtyLIm0rKIHVUtr36kUHpqx\nrVB5HXcn5s9fOAlzJ8HxvyFiCIz83Kntlb3cir52/9ZBrDp4lvXPXgdAy2Bf4DQeriYO/GdoyW0S\nQtQ40gFssS32PKO/MLqBuoX5s/mYMQ8+NjHD4f75JTmfns3wj9Y4POZZzI0asxl2/AiL/wUouPFD\nY9M1J8cPvIoIMKlZuWyPTaZfqyAa+XkBBWsQPN1cim+TEKLGkiCAcaO/+bN11vc/33cNX64+wmuL\n9tP37ZUce/P6Ul/zvh+2Wl9veHYA0WdSWXXwLNe0CKBDE7/CJ2RnwL558Pf7cO4QNO0Jo74o9W6b\nRQUBgAsX7Teb83A1egP96xQeYBZC1A61KghkZOeydG8C17YJxs+rYD+bNxbvt75eN9noKvH1vPy/\nmn2nUtho6X9/ekhrGvp50tDPs/CWzKkJsH8BHFllDP7mpBuJ1P/va+jwf5eVSzf/xl6Uv2xmCAX5\nGqvDejaXhO1C1Fa1JgicTc2i22vLAbg1KoS3Rne2li/ecxqAmNeHWxdu1bGZKlnUnHtHVh86y4Rv\nNgHQt1UQD17b0r5CagLs/tnYfuHUdkAbO212usVYhRvWF0yXv7mr+yXJZJ4b3obXFx2wvn9tVMGw\nTN9WQcx94BraNy7FTCUhRI1SK4LAhYwcHrfZmz/lYsHgb346xv+N72q3ctf2F/Xq6HP0a1U4sUpu\nnpkPlkczvGMj2llupPkBAIwdQAG4mAyHl8POWRCzArTZ2HLh2ueg7QgIblMWXxMwkrzYmtS3hV0Q\nyJ8JlK+s1kIIIaqnGh8EMnPyuP/HrXb77vt7F3QFHUvMwM1FMaS9/bRN26TtCRcyAfh27VEGtGlg\nDBTnZHLPh/NJS4zjwF/pfHVrBBeyzYww7SVIXWBQ42y6n0qBj2Mg8TCgoW4I9H4cOo2FoFbl8n0d\nTfN8dWQH6yI1WQwmhLBVI+8Im48lcYtlpo+ta1oEkJCSSUJKFskZ2by79BALdp5iSPsGherm30y9\nyETH/MmJ4wdov2sFDZceBhcTmHOYBpC/6do88AM+soyx6mRvlAqD4LbQ8RYI72MM9l5BV48zWjUw\nful3DvGz5gP4R89mvLRgL3lmjbd7jfyfXAhxmWrMHeHX7XE8PnsnW18Y6DAA/Gtoa+7uHU7rF/4g\n5mw6ka8UJHMZ1aXwXnYDwj34LewXWsfPx/1AHrnaRCLhfJ83mLHdW/D1pnPE5vpxWtcnWXvzxI3d\nePW33Sg0y18cjfLyv6yB3Svl7mpyOJupST0vYpMynFujIISoNWpMEHh89k4Aur663OHx27qH4uHq\n+AZ4aVcQiTG4fD+SjhdOMiOvH0vM3dhibkU6xvz6PWlN+DXrJACD2zXg730J3LUgEWgMgKpT9Wbb\n/HB3Dxbujqe+t0wHFUIUqNZBIM+sWRdzjjYNC89uubp5AI8MiMDPy806aAvGFs0jbbaD2P/KUPuZ\nP+eiYfpIyE6DO37nuc/PF7r2r9tPWl8Pad+QpfsSrO9nTep5pV+rXIQG1OH+/i0quxlCiCqmWgeB\nIR+sLmJrZPhqYpTDQdCOlyzUsltcdf44fD0IUDB+LjTpCiwstg3Xd2rEK7/vsy7EujQNpBBCVGXl\nO0pZzhLTsoo8VtQsGBeT4sOxRvbLDk0ueYLwDjQWad21xBIAIPq1YdzStWAX7Cb1vKyvZ9zTA083\nF94a3cladiWLzIQQoqJV2zvWqeSL1uQspXVTZBP867gXeirA3Ruuf9euyM3FxJQR7fl5axwPX9eS\neTuMrqBnh7XhmpaBgH0CmOI2cBNCiKrGqScBpdQ3SqkzSqk9NmX1lVLLlFLRlv/6W8qVUuojpdRh\npdQupdRVNudMtNSPtiSlKTWtNW/9cYCJlkVZN19VMLNn2p3dALjjmrASr9O3VRD+Tg6Senu4cuzN\n63lycGvy8rS1LF+Dup78+WQ/tr04qHSJYoQQopI52x00Dbh0r+HJwAqtdQSwwvIeYBhGMpkIjDzB\nn4MRNICXgB5Ad+Cl/MBRGuuPJPLZqhiiLWMBzw9vC8CQ9g3o3zqYpY/35aUb25X2sk5rEWzk8s3f\niz9f8yAfmXkjhKh2nOoO0lqvVkqFXVJ8E9Df8vo7YBVGtrGbgOmWlJMblFL1lFKNLHWX5SeZUUot\nwwgsM51t7MhP17LjRLJdWYCPB2snX0eQj7FqK3+xVHl5fVRHdp+8wDUtAsv1c4QQoiJcyZhAA611\nPIDWOl4pFWwpbwKcsKkXZykrqtwpqZk5hQJAfv+77WBteWtavw5N65c+v4AQQlRF5TE7yFGnuC6m\nvPAFlJqklNqilNpy9qyx9fHszSfs6vh6uvLyTe2vsKlCCFG7XUkQSLB082D57xlLeRzQ1KZeCHCq\nmPJCtNZTtdZRWuuooLmfyswAAAtVSURBVKAgLmbn8epCY89/NxcjluyeMoRbo5o6Ol0IIYSTriQI\nLADyZ/hMBObblE+wzBLqCVywdBstAQYrpfwtA8KDLWUlSkgxdvFsUs+LTc8NZM2/rr2CZgshhMjn\n1JiAUmomxsBuoFIqDmOWz5vAT0qpu4FY4BZL9UXAcOAwkAHcCaC1TlJK/QfYbKn3Sv4gcUk2HzOq\nvX5zR/y93Z2e2imEEKJ4zs4OGlfEoQEO6mrgwSKu8w3wjdOts/hhYywAUc0kAYoQQpSlKr9i+MLF\nHLLOpNGknpckRBFCiDJW5fcOik3KIDUrl+EdG5ZcWQghRKlU+SCQz8/LreRKQgghSqXaBIFAH4+S\nKwkhhCiVahMEIsp5OwghhKiNqk0QaNXAp7KbIIQQNU6VDwJtG9Vlxj098PWUMQEhhChrVT4IuJqU\nNXmLEEKIslXlg4AQQojyI0FACCFqMQkC4v/bO/cYuao6jn++fVja7vYh5dkitQSEVBBoQ6uktESL\nKBggUFQQlBBNQFBeSjS8IgR8AlaogkaBIkQiSEwhQQOIAiG0QMEUAoFUkYc8FKQFWuju1z/OmWZY\nd9tdOzP3zM7vk0xm5sydyWfOvff87vmde88NgqCDiSAQBEHQwUQQCIIg6GAiCARBEHQwSjM/l4uk\nV4C/N+jnpgCvNui3GkVpTqX5QDgNltKcSvOBznHa2fY2g1mw+CDQSCStsD27ao96SnMqzQfCabCU\n5lSaD4RTf0Q6KAiCoIOJIBAEQdDBdFoQuLpqgX4ozak0HwinwVKaU2k+EE7/Q0eNCQRBEATvpdN6\nAkEQBEEdEQSCIAiajCRV7TAQwy4ISBqZn4updElF1XNJdVOjtt5KQtLE/FzE+pO0fX4uZv1Jmilp\nq6o96pG0v6Rdqvbow9iqBQaiiI27EeQVfy1wjqT3u+LBDkn7SfoagO3eKl1qSJoj6efA2ZIGdSFJ\ns5E0W9JS4LwSdlxJIyRNkLQMWAzVrz9J+0i6E7gw+1Q+kCdpL0n3AhcBW1ftAyBpX0l/AO4CJlbt\nAyBprqSbgSslHVTiwc6wCAKSZgBLgLuBnYELJR1Soc9pwO9IAelTuayylS9ppKRLSGch3AfsC5wv\nabsKnUZIugK4CrgT2AG4QNK4qpxgY4O/BhgNTJX0WaimN6DEZcB1wLW2v9xqh01wDvBb20fYfh6q\n66FIGi3pKtL2vRi4A1iQP6usjZO0gNQu3QI8CXwBmFyVz0AMiyAAzAKesH0NcCawEjhU0k4V+TwN\nHAqcBHwLwHZPhd34EcCzwKJcR6cBc6mwi5ob27uAj2en7wMGNlTlVMfupMv4LweOldRtu7fV6y8f\n8XcBj9i+DkDSLhU3bCNyj22t7ctz2UJJk4CqUrFjgHuAebaXATcDe0gaVXEvbk9gue1fA0tJBxZr\nK/Tpl7YMArmLtVtd0XJgmqSdbL9GOtp9HTiiIp/bgMfy89paWoi8k1Tg1AvcaPspSWNsvwA8R5qz\npGX0rSfbt9h+XdJCYAWpN3CxpD2qcKprvJ4G3gFW58cXJX2gFWmYfralM4E5ks6VdB/wA+AaSbOa\n7dKfU25UXwbmSTpE0q3AWaQj8G/kZVpdT2/avsH22/n9KKDH9oZWBsx+1t1fgEWSzgMeJm3fSyQt\napXTYGirICBpkqTbgD8CR0vqyh+tA+4Fjs7vnwQeB7Zu5qBVPz7jax/Z7rG9DvgRcKKkKbabfpTb\nXx1ll9cBbK+X1A18EHih2T4DOI3P5bVG9zXgGNsLgbdIjW5TU1X9OdU1XrOBN2yvAlYB5wM/zWmH\npuwzA9WR7TeAK4EjSb3KzwMvAkc2e1xnE05rgF+Rxih+afuTwC+AuZLmttrJtnPqrLZu7gGOkDS5\nFT2Bgdol2yuBg4HpwMm2F5AOUA9u5YHO5mirIACMJ+X7Ts2vD8jlrwAPAHtK2s92D/A8sH9uiFvq\n02fD+1N2OxXSgHETffpzmtfPMnOAVbZfkNQladcWO9Xqyfl5he3b87K3A/uQgkHLnTLPAt2SfgN8\nE3gIeMr2u01sVAb0sb0YOND2n22vB24lBaoq62gZqXGr5bhXAC8B66twcqI3B4K/5WXmN9llIKeN\n+5ztB4FtshOkFGg38GaL3DZL8UFA0vGS5kuakAegrgZuIh397ydpam70HwAeAS7LkXgm8GyjBxo3\n4zNH0o55OUEaCyCdQXG2pP8A+zY6ZzoEp1H5K5OAf0g6gZRK27uRPkNx6odZpCPdhveahuA0mbTj\n/pMUkE4CPtToo7eh1FFOc9aYRUrn9TTSZ5BOU7PPY6T0zymSppAGPT8M/KsCp437XA7Std7/ulp5\nhU5jgPuBr+avfpx0NlUzD06HRJHTRuSVtj1wAymf/Qwpwn7d9qt5mf1J6Z8VtpfWffdSYBrpLKHj\nbT/ZYp/ltq/PZSOAGaSu8zvAabb/uqU+W+KUy5cCxwLXApflHboyJ0kTSL2Ti0kN75m2n6rAaeO2\nlNN3tc+7gPfZ/neLferraAzwUeCHpCBZeR3l8jNI2/iuwOm2H6/Aqb6eRuaTMJYCz9i+oBE+/4dT\n/bY0k5RS3B54FzjF9hON8tpibBf1AEbm592A6/PrUcBPgFv6LHs66Sh7ItBd+37tdcU+43LZtqSu\nfNV1NAHoymWfA44qwGkisFUu+wRwWCFO4+u2pREF+IzNZR8DDi+kjrrrykcX4jSuMKdJdetuLDCj\nkU4N+29VC9RV3CjSkeD3SLm8z5DOja59LtIR0Py6si7SaXwPkvKROxbmM62gOlqenXYo0Klh620Y\nbksdUUfD1Km27qY20qnRjyLGBCTNJw2+TSadnnchqdt0YG0g1al2vwNcUPfVQ4CTgUeBPZ1OfSzJ\n57lG+DTIaWV2erFAp4adpTQMt6VhX0fD2Km27p5vlFNTqDoK5cg5Dziu7v0S0mDcl4CHctkIUk7t\nJmB6LjsMOGC4+4RT+zqV5hNO7e3UlP9ZtUCutHGkq/5qebdjgUvy65XAqfn1bNJFTx3lE07t61Sa\nTzi1t1MzHkWkg2y/ZXu90+mUAAtJ5/4DnEC6BHwZcCPpyrumXppemk84ta9TaT7h1N5OzWDU5hdp\nHUqTrBnYDvh9Ll4DfJt0DvJq5/yacwjuJJ9wal+n0nzCqb2dGkkRPYE6ekmTLL0K7JWj7LlAr+17\n3foBltJ8wql9nUrzCaf2dmocVeej+j5Is1v2kuYCOjF8wmm4OJXmE07t7dSoR3FXDEuaBhwHXOo0\nT0r49CGcBkdpTqX5QDgNlhKdGkVxQSAIgiBoHaWNCQRBEAQtJIJAEARBBxNBIAiCoIOJIBAEQdDB\nRBAIgiDoYCIIBEEdknokrZS0StKjks7QZu4rLGm6pGNa5RgEjSSCQBC8l7dt7217JmmumE+T7gq1\nKaYDEQSCtiSuEwiCOiSttd1V934G6eYgU0i3LF1KuqUgpNsE3i/pAWAPYDXplp2Lge8CC0izUF5p\n+6qW/YkgGAIRBIKgjr5BIJe9BuxOmjSs1/Y6SbuSpg+eLWkBcJbtQ/PyXwG2tX1RvjfwfcAi26tb\n+meCYBAUNYtoEBRKbXrg0cAVkvYGekj3m+2Pg0gTjR2V308k3Yg9gkBQHBEEgmAT5HRQD/AyaWzg\nJeAjpPG0dQN9jXTDkTtaIhkEW0AMDAfBAEjaBvgZcIVT3nQi8KLtXtJkYiPzomuA7rqv3gGcJGl0\n/p3dJI0nCAokegJB8F7GSlpJSv1sIA0EX5o/WwLcLGkRcDfwZi5/DNgg6VHgGuDHpDOGHs53mnoF\nOLxVfyAIhkIMDAdBEHQwkQ4KgiDoYCIIBEEQdDARBIIgCDqYCAJBEAQdTASBIAiCDiaCQBAEQQcT\nQSAIgqCDiSAQBEHQwfwXezXtuoJWgoUAAAAASUVORK5CYII=\n", 23 | "text/plain": [ 24 | "
" 25 | ] 26 | }, 27 | "metadata": {}, 28 | "output_type": "display_data" 29 | } 30 | ], 31 | "source": [ 32 | "%matplotlib inline\n", 33 | "import pandas as pd \n", 34 | "data = pd.read_csv('sp500.csv', index_col='Date', parse_dates=['Date'])\n", 35 | "data['SMA'] = data['SP500'].rolling(200).mean()\n", 36 | "data.plot()\n", 37 | "\n" 38 | ] 39 | } 40 | ], 41 | "metadata": { 42 | "kernelspec": { 43 | "display_name": "Python 3", 44 | "language": "python", 45 | "name": "python3" 46 | }, 47 | "language_info": { 48 | "codemirror_mode": { 49 | "name": "ipython", 50 | "version": 3 51 | }, 52 | "file_extension": ".py", 53 | "mimetype": "text/x-python", 54 | "name": "python", 55 | "nbconvert_exporter": "python", 56 | "pygments_lexer": "ipython3", 57 | "version": "3.6.6" 58 | } 59 | }, 60 | "nbformat": 4, 61 | "nbformat_minor": 2 62 | } 63 | -------------------------------------------------------------------------------- /Chapter 6 Pandas/Simple Simulation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 10, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "data": { 12 | "text/plain": [ 13 | "" 14 | ] 15 | }, 16 | "execution_count": 10, 17 | "metadata": {}, 18 | "output_type": "execute_result" 19 | }, 20 | { 21 | "data": { 22 | "image/png": "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\nAABJRU5ErkJggg==\n", 23 | "text/plain": [ 24 | "
" 25 | ] 26 | }, 27 | "metadata": {}, 28 | "output_type": "display_data" 29 | } 30 | ], 31 | "source": [ 32 | "# Make sure the plot shows up\n", 33 | "%matplotlib inline\n", 34 | "\n", 35 | "# Import libraries that we need\n", 36 | "import pandas as pd \n", 37 | "import numpy as np\n", 38 | "\n", 39 | "# Read the data from disk\n", 40 | "data = pd.read_csv('sp500.csv', index_col='Date', parse_dates=['Date'])\n", 41 | "\n", 42 | "# Calculate two moving averages\n", 43 | "data['SMA50'] = data['SP500'].rolling(50).mean()\n", 44 | "data['SMA100'] = data['SP500'].rolling(100).mean()\n", 45 | "\n", 46 | "# Set to 1 if SMA50 is above SMA100\n", 47 | "data['Position'] = np.where(data['SMA50'] > data['SMA100'], 1, 0)\n", 48 | "\n", 49 | "# Buy a day delayed, shift the column\n", 50 | "data['Position'] = data['Position'].shift()\n", 51 | "\n", 52 | "# Calculate the daily percent returns of strategy\n", 53 | "data['StrategyPct'] = data['SP500'].pct_change(1) * data['Position']\n", 54 | "\n", 55 | "# Calculate cumulative returns\n", 56 | "data['Strategy'] = (data['StrategyPct'] + 1).cumprod()\n", 57 | "\n", 58 | "# Calculate index cumulative returns\n", 59 | "data['BuyHold'] = (data['SP500'].pct_change(1) + 1).cumprod()\n", 60 | "\n", 61 | "# Plot the result\n", 62 | "data[['Strategy', 'BuyHold']].plot()\n", 63 | "\n" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 15, 69 | "metadata": { 70 | "collapsed": false, 71 | "scrolled": false 72 | }, 73 | "outputs": [], 74 | "source": [ 75 | "data.to_clipboard()" 76 | ] 77 | } 78 | ], 79 | "metadata": { 80 | "kernelspec": { 81 | "display_name": "Python 3", 82 | "language": "python", 83 | "name": "python3" 84 | }, 85 | "language_info": { 86 | "codemirror_mode": { 87 | "name": "ipython", 88 | "version": 3 89 | }, 90 | "file_extension": ".py", 91 | "mimetype": "text/x-python", 92 | "name": "python", 93 | "nbconvert_exporter": "python", 94 | "pygments_lexer": "ipython3", 95 | "version": "3.6.6" 96 | } 97 | }, 98 | "nbformat": 4, 99 | "nbformat_minor": 2 100 | } 101 | -------------------------------------------------------------------------------- /Chapter 6 Pandas/pandas_samples.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | data = pd.read_csv("spy.csv", index_col=0, parse_dates=[0]) 4 | 5 | data['pct'] = data['Close'].pct_change() 6 | 7 | start = '2016/5/5' 8 | end = '2017' 9 | 10 | 11 | data_window = data[start:end] 12 | 13 | min_pct = data_window['pct'].min() 14 | max_pct = data_window['pct'].max() 15 | std = data_window['pct'].std() 16 | 17 | -------------------------------------------------------------------------------- /Chapter 6 Pandas/spy.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close 2 | 2014-05-12,188.8,189.88,187.9992,189.785 3 | 2014-05-13,190.04,190.42,189.77,189.96 4 | 2014-05-14,189.79,189.88,188.79,189.06 5 | 2014-05-15,188.675,188.72,186.48,187.4 6 | 2014-05-16,187.51,188.13,186.72,188.05 7 | 2014-05-19,187.69,188.89,187.52,188.74 8 | 2014-05-20,188.645,188.67,187.07,187.55 9 | 2014-05-21,188.09,189.22,188.06,189.13 10 | 2014-05-22,189.18,189.98,188.86,189.59 11 | 2014-05-23,189.76,190.48,189.5858,190.35 12 | 2014-05-27,191.06,191.58,190.95,191.52 13 | 2014-05-28,191.52,191.82,191.06,191.38 14 | 2014-05-29,191.82,192.4,191.33,192.37 15 | 2014-05-30,192.19,192.8,192.03,192.68 16 | 2014-06-02,192.95,192.99,191.97,192.895 17 | 2014-06-03,192.43,192.9,192.25,192.8 18 | 2014-06-04,192.47,193.3,192.265,193.19 19 | 2014-06-05,193.41,194.65,192.7,194.45 20 | 2014-06-06,194.87,195.43,194.78,195.375 21 | 2014-06-09,195.35,196.05,195.17,195.58 22 | 2014-06-10,195.34,195.64,194.92,195.6 23 | 2014-06-11,194.9,195.12,194.48,194.92 24 | 2014-06-12,194.69,194.8,193.11,193.54 25 | 2014-06-13,193.92,194.32,193.3,194.13 26 | 2014-06-16,193.89,194.7,193.66,194.29 27 | 2014-06-17,194.02,194.97,193.81,194.83 28 | 2014-06-18,194.83,196.37,194.4,196.255 29 | 2014-06-19,196.43,196.6,195.8,196.48 30 | 2014-06-20,196.03,196.1039,195.7,195.94 31 | 2014-06-23,195.99,196.05,195.52,195.88 32 | 2014-06-24,195.53,196.5,194.48,194.7 33 | 2014-06-25,194.29,195.781,194.25,195.58 34 | 2014-06-26,195.61,195.63,194.13,195.44 35 | 2014-06-27,194.98,195.88,194.885,195.82 36 | 2014-06-30,195.7,196.165,195.53,195.72 37 | 2014-07-01,196.2,197.63,196.13,197.03 38 | 2014-07-02,197.05,197.48,196.96,197.23 39 | 2014-07-03,197.79,198.29,197.64,198.2 40 | 2014-07-07,197.82,197.98,197.22,197.51 41 | 2014-07-08,197.15,197.22,195.76,196.24 42 | 2014-07-09,196.73,197.295,196.31,197.12 43 | 2014-07-10,195.22,196.86,195.06,196.34 44 | 2014-07-11,196.22,196.75,195.78,196.61 45 | 2014-07-14,197.61,197.86,197.44,197.6 46 | 2014-07-15,197.72,198.1,196.36,197.23 47 | 2014-07-16,198.11,198.26,197.42,197.96 48 | 2014-07-17,197.35,198.1,195.43,195.71 49 | 2014-07-18,196.35,197.91,196.24,197.7099 50 | 2014-07-21,197.09,197.5,196.43,197.34 51 | 2014-07-22,198.01,198.56,197.87,198.2 52 | 2014-07-23,198.495,198.85,198.1,198.64 53 | 2014-07-24,198.83,199.06,198.45,198.65 54 | 2014-07-25,198.09,198.26,197.33,197.72 55 | 2014-07-28,197.76,198.09,196.62,197.8 56 | 2014-07-29,198.17,198.45,196.92,196.95 57 | 2014-07-30,197.65,197.91,196.16,196.98 58 | 2014-07-31,195.61,195.78,192.97,193.09 59 | 2014-08-01,192.56,193.76,191.57,192.5 60 | 2014-08-04,192.87,194.3,192.05,193.89 61 | 2014-08-05,193.1,193.6,191.31,192.01 62 | 2014-08-06,191.11,192.89,191.08,192.07 63 | 2014-08-07,192.935,193.13,190.55,191.03 64 | 2014-08-08,191.46,193.37,190.95,193.24 65 | 2014-08-11,193.965,194.66,193.71,193.795 66 | 2014-08-12,193.61,194.15,192.94,193.53 67 | 2014-08-13,194.29,195.06,193.96,194.84 68 | 2014-08-14,195.16,195.76,194.98,195.76 69 | 2014-08-15,196.47,196.65,194.31,195.72 70 | 2014-08-18,196.8,197.45,196.69,197.36 71 | 2014-08-19,197.84,198.54,197.4426,198.39 72 | 2014-08-20,198.12,199.16,198.08,198.92 73 | 2014-08-21,199.09,199.76,198.93,199.5 74 | 2014-08-22,199.34,199.69,198.74,199.19 75 | 2014-08-25,200.14,200.5949,199.1502,200.2 76 | 2014-08-26,200.33,200.82,200.28,200.33 77 | 2014-08-27,200.43,200.57,199.94,200.25 78 | 2014-08-28,199.59,200.27,199.39,200.14 79 | 2014-08-29,200.45,200.73,199.82,200.71 80 | 2014-09-02,200.97,200.995,199.86,200.61 81 | 2014-09-03,201.38,201.41,200.22,200.5 82 | 2014-09-04,200.84,201.58,199.66,200.2101 83 | 2014-09-05,200.17,201.19,199.41,201.11 84 | 2014-09-08,200.92,201.21,200,200.59 85 | 2014-09-09,200.41,200.55,198.91,199.32 86 | 2014-09-10,199.43,200.2,198.77,200.07 87 | 2014-09-11,199.27,200.33,199.12,200.3 88 | 2014-09-12,200.1,200.12,198.56,199.13 89 | 2014-09-15,199.16,199.32,198.38,198.981 90 | 2014-09-16,198.61,200.84,198.5,200.48 91 | 2014-09-17,200.77,201.68,199.75,200.75 92 | 2014-09-18,201.36,201.85,201.1,201.82 93 | 2014-09-19,201.52,201.899,200.29,200.7 94 | 2014-09-22,200.35,200.38,198.73,199.15 95 | 2014-09-23,198.43,199.26,197.95,198.01 96 | 2014-09-24,198.04,199.69,197.52,199.56 97 | 2014-09-25,199.04,199.05,196.27,196.34 98 | 2014-09-26,196.7,198.39,196.42,197.9 99 | 2014-09-29,196.2,197.89,196.05,197.54 100 | 2014-09-30,197.69,198.3,196.61,197.02 101 | 2014-10-01,196.7,196.77,193.91,194.35 102 | 2014-10-02,194.18,195.055,192.35,194.38 103 | 2014-10-03,195.68,196.94,195.08,196.52 104 | 2014-10-06,197.34,197.6,195.582,196.29 105 | 2014-10-07,195.28,195.72,193.22,193.26 106 | 2014-10-08,193.37,196.92,192.36,196.64 107 | 2014-10-09,196.33,196.6,192.58,192.74 108 | 2014-10-10,192.69,193.65,190.49,190.54 109 | 2014-10-13,190.46,191.15,187.3,187.4099 110 | 2014-10-14,188.42,189.82,187.04,187.7 111 | 2014-10-15,185.16,187.694,181.92,186.43 112 | 2014-10-16,183.06,187.58,182.89,186.27 113 | 2014-10-17,188.42,189.75,187.62,188.47 114 | 2014-10-20,188.13,190.45,188.07,190.3 115 | 2014-10-21,191.68,194.2,191.48,194.07 116 | 2014-10-22,194.41,194.91,192.61,192.69 117 | 2014-10-23,194.62,196.2,194.26,194.93 118 | 2014-10-24,195.25,196.49,194.49,196.43 119 | 2014-10-27,195.73,196.45,195.03,196.16 120 | 2014-10-28,196.82,198.42,196.73,198.41 121 | 2014-10-29,198.55,199.12,196.8,198.11 122 | 2014-10-30,197.58,199.95,197.4,199.38 123 | 2014-10-31,201.78,201.82,200.77,201.66 124 | 2014-11-03,201.92,202.45,201.305,201.77 125 | 2014-11-04,201.23,201.6,200.06,201.07 126 | 2014-11-05,202.54,202.59,201.45,202.34 127 | 2014-11-06,202.39,203.26,201.64,203.15 128 | 2014-11-07,203.17,203.5999,202.61,203.34 129 | 2014-11-10,203.38,204.04,203.13,203.98 130 | 2014-11-11,204.055,204.31,203.65,204.175 131 | 2014-11-12,203.35,204.24,203.31,203.96 132 | 2014-11-13,204.16,204.83,203.21,204.19 133 | 2014-11-14,204.1,204.49,203.72,204.24 134 | 2014-11-17,203.85,204.58,203.65,204.37 135 | 2014-11-18,204.44,205.92,204.44,205.55 136 | 2014-11-19,205.31,205.55,204.3,205.22 137 | 2014-11-20,204.26,205.71,204.18,205.58 138 | 2014-11-21,207.64,207.8445,205.98,206.68 139 | 2014-11-24,207.17,207.39,206.91,207.26 140 | 2014-11-25,207.54,207.79,206.8,207.11 141 | 2014-11-26,207.29,207.76,207.03,207.64 142 | 2014-11-28,207.49,207.87,206.91,207.2 143 | 2014-12-01,206.4,206.54,205.38,205.76 144 | 2014-12-02,205.81,207.34,205.782,207.085 145 | 2014-12-03,207.3,208.15,207.1,207.89 146 | 2014-12-04,207.54,208.265,206.7,207.66 147 | 2014-12-05,207.87,208.47,207.55,208 148 | 2014-12-08,207.52,208.12,205.93,206.61 149 | 2014-12-09,204.37,206.6,203.91,206.47 150 | 2014-12-10,205.91,205.98,202.93,203.1601 151 | 2014-12-11,203.88,206.19,203.71,204.19 152 | 2014-12-12,202.64,203.819,200.85,200.89 153 | 2014-12-15,201.98,202.53,198.78,199.51 154 | 2014-12-16,198.58,202.395,197.86,197.91 155 | 2014-12-17,198.44,202.34,198.29,201.79 156 | 2014-12-18,204.74,212.97,203.92,206.78 157 | 2014-12-19,206.43,207.33,205.6109,206.52 158 | 2014-12-22,206.75,207.47,206.46,207.47 159 | 2014-12-23,208.17,208.23,207.3991,207.75 160 | 2014-12-24,208.02,208.34,207.72,207.77 161 | 2014-12-26,208.31,208.85,208.25,208.44 162 | 2014-12-29,208.22,208.97,208.14,208.72 163 | 2014-12-30,208.21,208.37,207.51,207.6 164 | 2014-12-31,207.99,208.19,205.39,205.54 165 | 2015-01-02,206.38,206.88,204.18,205.43 166 | 2015-01-05,204.17,204.37,201.35,201.72 167 | 2015-01-06,202.09,202.72,198.855,199.82 168 | 2015-01-07,201.42,202.72,200.88,202.31 169 | 2015-01-08,204.01,206.16,203.99,205.9 170 | 2015-01-09,206.4,206.42,203.51,204.25 171 | 2015-01-12,204.41,204.6,201.92,202.65 172 | 2015-01-13,204.12,205.48,200.51,202.08 173 | 2015-01-14,199.65,201.1,198.57,200.86 174 | 2015-01-15,201.63,202.01,198.88,199.0199 175 | 2015-01-16,198.77,201.82,198.55,201.63 176 | 2015-01-20,202.4,202.72,200.17,202.055 177 | 2015-01-21,201.5,203.66,200.94,203.08 178 | 2015-01-22,203.99,206.26,202.33,206.1 179 | 2015-01-23,205.79,206.1,204.81,204.97 180 | 2015-01-26,204.71,205.56,203.85,205.45 181 | 2015-01-27,202.97,204.12,201.74,202.74 182 | 2015-01-28,204.17,204.29,199.91,200.14 183 | 2015-01-29,200.38,202.3,198.68,201.9902 184 | 2015-01-30,200.57,202.17,199.13,199.45 185 | 2015-02-02,200.05,202.03,197.86,201.92 186 | 2015-02-03,203,204.85,202.55,204.84 187 | 2015-02-04,203.92,205.38,203.51,204.06 188 | 2015-02-05,204.86,206.3,204.77,206.12 189 | 2015-02-06,206.56,207.24,204.92,205.55 190 | 2015-02-09,204.77,205.64,204.135,204.63 191 | 2015-02-10,205.88,207.12,204.6801,206.81 192 | 2015-02-11,206.61,207.45,205.83,206.93 193 | 2015-02-12,207.89,208.99,206.9727,208.92 194 | 2015-02-13,209.07,209.84,208.76,209.78 195 | 2015-02-17,209.4,210.32,209.1,210.11 196 | 2015-02-18,209.66,210.22,209.3401,210.13 197 | 2015-02-19,209.41,210.42,209.24,209.98 198 | 2015-02-20,209.48,211.33,208.73,211.239 199 | 2015-02-23,210.94,211.21,210.48,211.209 200 | 2015-02-24,211.12,212.05,210.76,211.81 201 | 2015-02-25,211.66,212.24,211.22,211.63 202 | 2015-02-26,211.52,211.71,210.65,211.38 203 | 2015-02-27,211.26,211.58,210.6,210.66 204 | 2015-03-02,210.78,212.06,210.72,211.99 205 | 2015-03-03,211.47,212.054,210.08,211.12 206 | 2015-03-04,210.4,210.49,209.06,210.2301 207 | 2015-03-05,210.62,210.8,209.85,210.46 208 | 2015-03-06,209.42,209.94,207.1,207.5 209 | 2015-03-09,207.74,208.79,207.5459,208.36 210 | 2015-03-10,206.71,206.81,204.93,204.98 211 | 2015-03-11,205.29,205.5,204.4,204.5 212 | 2015-03-12,205.26,207.175,205.2,207.1 213 | 2015-03-13,206.77,207.9338,204.58,205.8272 214 | 2015-03-16,206.71,208.69,205.8641,208.58 215 | 2015-03-17,207.69,208.42,206.98,207.96 216 | 2015-03-18,207.39,211.27,206.62,210.46 217 | 2015-03-19,209.96,210.4697,209.03,209.5 218 | 2015-03-20,209.71,211.02,209.4903,210.41 219 | 2015-03-23,210.42,211.11,210,210 220 | 2015-03-24,209.85,210.4,208.74,208.82 221 | 2015-03-25,209.07,209.35,205.71,205.76 222 | 2015-03-26,204.96,206.37,204.12,205.27 223 | 2015-03-27,205.13,205.95,204.9,205.74 224 | 2015-03-30,206.98,208.61,206.96,208.25 225 | 2015-03-31,207.26,208.1,206.36,206.43 226 | 2015-04-01,206.39,206.42,204.51,205.7 227 | 2015-04-02,205.62,206.98,205.4,206.435 228 | 2015-04-06,205.37,208.45,205.21,207.83 229 | 2015-04-07,207.855,208.76,207.24,207.28 230 | 2015-04-08,207.55,208.51,207.08,207.975 231 | 2015-04-09,207.78,209.18,207.19,208.9 232 | 2015-04-10,209.2,210.09,208.96,210.04 233 | 2015-04-13,209.87,210.63,209.03,209.09 234 | 2015-04-14,208.85,209.71,208.1,209.49 235 | 2015-04-15,210.05,211.04,209.95,210.43 236 | 2015-04-16,210.03,210.98,209.7928,210.37 237 | 2015-04-17,208.94,209.23,207.01,207.95 238 | 2015-04-20,209.06,210.25,208.96,209.85 239 | 2015-04-21,210.67,210.86,209.24,209.6 240 | 2015-04-22,210.01,210.85,208.9,210.63 241 | 2015-04-23,210.15,211.94,210.01,211.16 242 | 2015-04-24,211.66,211.97,211.11,211.6499 243 | 2015-04-27,212.33,212.48,210.54,210.77 244 | 2015-04-28,210.74,211.5,209.3301,211.44 245 | 2015-04-29,210.37,211.29,209.6,210.57 246 | 2015-04-30,209.88,210.35,207.62,208.46 247 | 2015-05-01,209.4,210.77,209.28,210.72 248 | 2015-05-04,211.23,212.02,211.1,211.32 249 | 2015-05-05,211.03,211.46,208.73,208.9 250 | 2015-05-06,209.56,209.93,206.76,208.04 251 | 2015-05-07,207.92,209.38,207.52,208.87 252 | 2015-05-08,210.88,211.86,210.78,211.62 253 | 2015-05-11,211.57,211.89,210.52,210.605 254 | 2015-05-12,209.61,210.63,208.62,209.98 255 | 2015-05-13,210.47,211.22,209.74,210.02 256 | 2015-05-14,211.24,212.32,210.91,212.21 257 | 2015-05-15,212.44,212.61,211.86,212.44 258 | 2015-05-18,212.24,213.4,212.16,213.1 259 | 2015-05-19,213.24,213.57,212.69,213.03 260 | 2015-05-20,213.15,213.78,212.504,212.88 261 | 2015-05-21,212.71,213.75,212.51,213.5 262 | 2015-05-22,213.04,213.54,212.91,212.99 263 | 2015-05-26,212.4,212.9089,210.2,210.7 264 | 2015-05-27,211.25,212.98,210.7612,212.7 265 | 2015-05-28,212.33,212.59,211.63,212.46 266 | 2015-05-29,212.38,212.43,210.82,211.14 267 | 2015-06-01,211.94,212.34,210.62,211.57 268 | 2015-06-02,211.02,212.19,210.27,211.36 269 | 2015-06-03,212,212.67,211.3301,211.92 270 | 2015-06-04,211.07,211.859,209.75,210.1292 271 | 2015-06-05,209.95,210.58,208.98,209.77 272 | 2015-06-08,209.64,209.82,208.39,208.48 273 | 2015-06-09,208.45,209.1,207.69,208.45 274 | 2015-06-10,209.37,211.41,209.2987,210.95 275 | 2015-06-11,211.48,212.09,211.2,211.63 276 | 2015-06-12,210.64,211.482,209.68,210.01 277 | 2015-06-15,208.64,209.45,207.79,209.11 278 | 2015-06-16,208.93,210.35,208.72,210.25 279 | 2015-06-17,210.59,211.32,209.36,210.59 280 | 2015-06-18,211.31,213.34,210.6315,212.78 281 | 2015-06-19,211.46,211.55,210.36,210.81 282 | 2015-06-22,211.905,212.59,211.64,211.89 283 | 2015-06-23,212.14,212.44,211.57,212.04 284 | 2015-06-24,211.72,212.17,210.47,210.5 285 | 2015-06-25,211.1,211.25,209.77,209.86 286 | 2015-06-26,210.29,210.58,209.16,209.82 287 | 2015-06-29,208.045,209.828,205.33,205.42 288 | 2015-06-30,207.26,207.32,205.28,205.85 289 | 2015-07-01,207.73,208.03,206.56,207.5 290 | 2015-07-02,208.07,208.27,206.81,207.31 291 | 2015-07-06,205.77,207.65,205.53,206.72 292 | 2015-07-07,206.96,208.17,204.11,208.02 293 | 2015-07-08,206.42,206.7645,204.25,204.53 294 | 2015-07-09,207.04,207.35,204.77,204.9 295 | 2015-07-10,207.29,207.98,204.9517,207.48 296 | 2015-07-13,208.99,209.9,208.94,209.77 297 | 2015-07-14,209.72,211.05,209.65,210.68 298 | 2015-07-15,210.73,211.28,210.04,210.61 299 | 2015-07-16,211.87,212.3,211.58,212.3 300 | 2015-07-17,212.29,212.55,211.8,212.48 301 | 2015-07-20,212.75,213.18,212.21,212.59 302 | 2015-07-21,212.43,212.74,211.39,211.75 303 | 2015-07-22,210.93,211.77,210.89,211.37 304 | 2015-07-23,211.53,211.65,209.75,210.18 305 | 2015-07-24,210.3,210.37,207.6,208 306 | 2015-07-27,206.94,207.55,206.26,206.79 307 | 2015-07-28,207.79,209.5,206.8,209.33 308 | 2015-07-29,209.48,211.04,209.31,210.77 309 | 2015-07-30,210.16,211.02,209.42,210.82 310 | 2015-07-31,211.42,211.45,210.16,210.5 311 | 2015-08-03,210.46,210.53,208.65,209.79 312 | 2015-08-04,209.7,210.2483,208.8,209.38 313 | 2015-08-05,210.45,211.31,209.73,210.07 314 | 2015-08-06,210.29,210.415,207.65,208.35 315 | 2015-08-07,208.16,208.34,206.87,207.95 316 | 2015-08-10,209.28,210.67,209.28,210.57 317 | 2015-08-11,208.97,209.47,207.76,208.67 318 | 2015-08-12,207.11,209.14,205.36,208.92 319 | 2015-08-13,208.73,209.55,208.01,208.66 320 | 2015-08-14,208.43,209.5087,208.26,209.42 321 | 2015-08-17,208.71,210.59,208.16,210.59 322 | 2015-08-18,210.26,210.68,209.699,209.98 323 | 2015-08-19,209.09,210.01,207.35,208.32 324 | 2015-08-20,206.51,208.2865,203.9,203.97 325 | 2015-08-21,201.73,203.9404,197.52,197.83 326 | 2015-08-24,187.49,197.4772,182.4,189.5 327 | 2015-08-25,195.43,195.45,186.92,187.27 328 | 2015-08-26,192.08,194.79,188.37,194.46 329 | 2015-08-27,197.02,199.42,195.21,199.27 330 | 2015-08-28,198.5,199.835,197.92,199.28 331 | 2015-08-31,198.11,199.125,197.01,197.67 332 | 2015-09-01,193.12,194.77,190.73,191.77 333 | 2015-09-02,194.62,195.46,192.42,195.41 334 | 2015-09-03,196.26,198.05,194.96,195.55 335 | 2015-09-04,192.85,193.86,191.61,192.59 336 | 2015-09-08,195.94,197.61,195.17,197.43 337 | 2015-09-09,199.32,199.47,194.35,194.79 338 | 2015-09-10,194.56,197.22,194.25,195.85 339 | 2015-09-11,195.375,196.82,194.53,196.74 340 | 2015-09-14,196.95,197.01,195.43,196.01 341 | 2015-09-15,196.61,198.99,195.9612,198.46 342 | 2015-09-16,198.82,200.41,198.41,200.18 343 | 2015-09-17,200.02,202.89,199.28,199.73 344 | 2015-09-18,195.71,198.6844,194.96,195.45 345 | 2015-09-21,196.44,197.68,195.21,196.46 346 | 2015-09-22,193.88,194.46,192.56,193.91 347 | 2015-09-23,194.11,194.67,192.91,193.6 348 | 2015-09-24,192.15,193.45,190.56,192.9 349 | 2015-09-25,194.64,195,191.81,192.85 350 | 2015-09-28,191.78,191.91,187.64,188.01 351 | 2015-09-29,188.27,189.74,186.93,188.12 352 | 2015-09-30,190.37,191.825,189.44,191.63 353 | 2015-10-01,192.08,192.49,189.82,192.13 354 | 2015-10-02,189.77,195.03,189.12,195 355 | 2015-10-05,196.46,198.74,196.33,198.47 356 | 2015-10-06,198.31,198.98,197,197.79 357 | 2015-10-07,198.9,199.825,197.48,199.41 358 | 2015-10-08,198.95,201.55,198.59,201.21 359 | 2015-10-09,201.38,201.9,200.58,201.33 360 | 2015-10-12,201.42,201.76,200.91,201.52 361 | 2015-10-13,200.65,202.16,200.05,200.25 362 | 2015-10-14,200.18,200.87,198.94,199.29 363 | 2015-10-15,200.08,202.36,199.64,202.35 364 | 2015-10-16,202.83,203.29,201.92,203.27 365 | 2015-10-19,202.5,203.37,202.13,203.37 366 | 2015-10-20,202.85,203.84,202.5471,203.11 367 | 2015-10-21,203.61,203.79,201.65,201.85 368 | 2015-10-22,202.98,205.51,201.85,205.26 369 | 2015-10-23,207.25,207.95,206.3,207.51 370 | 2015-10-26,207.3,207.37,206.56,207 371 | 2015-10-27,206.2,207,205.79,206.6 372 | 2015-10-28,207,208.98,206.21,208.95 373 | 2015-10-29,208.35,209.27,208.21,208.83 374 | 2015-10-30,209.06,209.44,207.74,207.93 375 | 2015-11-02,208.32,210.62,208.17,210.39 376 | 2015-11-03,209.97,211.66,209.7,211 377 | 2015-11-04,211.35,211.5,209.7201,210.36 378 | 2015-11-05,210.43,210.98,209.09,210.15 379 | 2015-11-06,209.74,210.32,208.46,210.04 380 | 2015-11-09,209.31,209.49,206.95,208.08 381 | 2015-11-10,207.51,208.6,207.19,208.56 382 | 2015-11-11,208.88,208.94,207.66,207.74 383 | 2015-11-12,206.5,207.06,204.82,204.84 384 | 2015-11-13,204.35,204.67,202.435,202.54 385 | 2015-11-16,202.32,205.69,202.18,205.62 386 | 2015-11-17,205.99,207.04,204.88,205.47 387 | 2015-11-18,206.04,208.9,205.99,208.73 388 | 2015-11-19,208.59,209.05,208.2,208.55 389 | 2015-11-20,209.45,210.12,208.86,209.3108 390 | 2015-11-23,209.38,209.98,208.52,209.07 391 | 2015-11-24,207.87,209.83,207.41,209.35 392 | 2015-11-25,209.5,209.74,209.01,209.32 393 | 2015-11-27,209.43,209.8,208.86,209.56 394 | 2015-11-30,209.75,209.89,208.56,208.69 395 | 2015-12-01,209.44,210.82,209.11,210.68 396 | 2015-12-02,210.615,211,208.23,208.529 397 | 2015-12-03,208.83,209.15,204.7511,205.61 398 | 2015-12-04,206.08,209.97,205.93,209.62 399 | 2015-12-07,209.23,209.7295,207.2,208.35 400 | 2015-12-08,206.49,208.289,205.78,206.949 401 | 2015-12-09,206.19,208.68,204.18,205.34 402 | 2015-12-10,205.42,207.43,205.14,205.87 403 | 2015-12-11,203.35,204.14,201.51,201.88 404 | 2015-12-14,202.07,203.05,199.95,202.9008 405 | 2015-12-15,204.7,206.11,202.8666,205.0308 406 | 2015-12-16,206.365,208.39,204.8,208.03 407 | 2015-12-17,208.4,208.48,204.84,204.86 408 | 2015-12-18,202.77,202.93,199.83,200.0208 409 | 2015-12-21,201.41,201.88,200.09,201.67 410 | 2015-12-22,202.715,203.85,201.55,203.5 411 | 2015-12-23,204.69,206.07,204.58,206.02 412 | 2015-12-24,205.72,206.33,205.42,205.68 413 | 2015-12-28,204.86,205.26,203.94,205.21 414 | 2015-12-29,206.51,207.79,206.47,207.4 415 | 2015-12-30,207.11,207.21,205.76,205.93 416 | 2015-12-31,205.13,205.89,203.87,203.87 417 | 2016-01-04,200.49,201.03,198.59,201.0192 418 | 2016-01-05,201.4,201.9,200.05,201.36 419 | 2016-01-06,198.34,200.06,197.6,198.82 420 | 2016-01-07,195.33,197.44,193.59,194.05 421 | 2016-01-08,195.19,195.85,191.58,191.923 422 | 2016-01-11,193.01,193.41,189.82,192.11 423 | 2016-01-12,193.82,194.55,191.14,193.6608 424 | 2016-01-13,194.45,194.86,188.38,188.83 425 | 2016-01-14,189.55,193.26,187.66,191.93 426 | 2016-01-15,186.77,188.76,185.52,187.81 427 | 2016-01-19,189.96,190.11,186.2,188.06 428 | 2016-01-20,185.03,187.495,181.02,185.65 429 | 2016-01-21,186.21,188.87,184.64,186.69 430 | 2016-01-22,189.78,190.76,188.88,190.52 431 | 2016-01-25,189.92,190.15,187.41,187.64 432 | 2016-01-26,188.42,190.53,188.02,190.2 433 | 2016-01-27,189.58,191.56,187.06,188.13 434 | 2016-01-28,189.96,190.2,187.16,189.11 435 | 2016-01-29,190.02,193.88,189.88,193.7208 436 | 2016-02-01,192.53,194.58,191.84,193.65 437 | 2016-02-02,191.96,191.97,189.54,190.16 438 | 2016-02-03,191.41,191.78,187.1,191.3 439 | 2016-02-04,190.71,192.75,189.96,191.6 440 | 2016-02-05,190.99,191.6696,187.2,187.95 441 | 2016-02-08,185.77,186.12,182.8,185.42 442 | 2016-02-09,183.36,186.94,183.2,185.43 443 | 2016-02-10,186.41,188.34,185.12,185.27 444 | 2016-02-11,182.34,184.1,181.09,182.86 445 | 2016-02-12,184.96,186.65,183.96,186.63 446 | 2016-02-16,188.77,189.81,187.63,189.78 447 | 2016-02-17,191.16,193.32,191.01,192.88 448 | 2016-02-18,193.2,193.27,191.72,192.09 449 | 2016-02-19,191.17,192.18,190.45,192 450 | 2016-02-22,193.87,194.95,193.79,194.78 451 | 2016-02-23,194,194.32,192.18,192.32 452 | 2016-02-24,190.63,193.53,189.32,193.2 453 | 2016-02-25,193.73,195.55,192.83,195.54 454 | 2016-02-26,196.57,196.68,194.9,195.0892 455 | 2016-02-29,195.11,196.23,193.33,193.56 456 | 2016-03-01,195.01,198.21,194.4542,198.11 457 | 2016-03-02,197.74,199.06,197.25,199 458 | 2016-03-03,198.79,199.795,198.11,199.775 459 | 2016-03-04,200.01,201.35,199.03,200.43 460 | 2016-03-07,199.34,201.07,199.25,200.59 461 | 2016-03-08,199.32,199.92,198.21,198.4 462 | 2016-03-09,199.36,199.79,198.43,199.38 463 | 2016-03-10,199.96,201.07,197.38,199.54 464 | 2016-03-11,201.26,202.81,199.5179,202.76 465 | 2016-03-14,202.16,203.04,201.77,202.5 466 | 2016-03-15,201.36,202.5307,201.05,202.17 467 | 2016-03-16,201.6,203.82,201.55,203.34 468 | 2016-03-17,203.24,205.23,202.77,204.63 469 | 2016-03-18,204.17,204.78,203.8,204.38 470 | 2016-03-21,204.07,204.94,203.8,204.67 471 | 2016-03-22,203.76,205.23,203.57,204.56 472 | 2016-03-23,204.11,204.33,203.01,203.2092 473 | 2016-03-24,202,203.16,201.74,203.12 474 | 2016-03-28,203.61,203.86,202.705,203.24 475 | 2016-03-29,202.76,205.25,202.4,205.1208 476 | 2016-03-30,206.3,206.87,205.59,206.02 477 | 2016-03-31,205.91,206.41,205.33,205.52 478 | 2016-04-01,204.35,207.14,203.98,206.92 479 | 2016-04-04,206.83,207.07,205.89,206.25 480 | 2016-04-05,204.67,206.2642,203.89,204.1892 481 | 2016-04-06,204.29,206.49,203.98,206.42 482 | 2016-04-07,205.14,205.56,203.09,203.95 483 | 2016-04-08,205.34,205.85,203.87,204.4992 484 | 2016-04-11,205.25,206.07,203.91,204.0201 485 | 2016-04-12,204.22,206.25,203.7,205.92 486 | 2016-04-13,207,208.1,206.84,208.0008 487 | 2016-04-14,208.07,208.6,207.6,208.01 488 | 2016-04-15,208.01,208.1721,207.4,207.78 489 | 2016-04-18,207.14,209.28,207,209.2392 490 | 2016-04-19,209.74,210.2,208.94,209.9 491 | 2016-04-20,209.95,210.92,209.39,210.1 492 | 2016-04-21,210.12,210.25,208.65,208.97 493 | 2016-04-22,208.55,209.29,207.91,208.97 494 | 2016-04-25,208.26,208.66,207.54,208.61 495 | 2016-04-26,209.04,209.52,208.36,208.9192 496 | 2016-04-27,208.47,209.81,208.05,209.35 497 | 2016-04-28,208.46,209.76,206.96,207.4475 498 | 2016-04-29,206.72,207.13,205.03,206.3308 499 | 2016-05-02,206.92,208.18,206.41,207.97 500 | 2016-05-03,206.52,206.8,205.28,206.1592 501 | 2016-05-04,204.99,205.85,204.42,205.01 502 | 2016-05-05,205.56,205.98,204.47,204.97 503 | 2016-05-06,204.06,205.77,203.88,205.72 504 | 2016-05-09,205.57,206.4,205.36,205.8892 505 | 2016-05-10,206.72,208.5,206.64,208.45 506 | 2016-05-11,207.91,208.54,206.5,206.5 507 | 2016-05-12,207.29,207.4899,205.37,206.56 508 | 2016-05-13,206.21,206.86,204.38,204.76 509 | 2016-05-16,204.96,207.34,204.89,206.78 510 | 2016-05-17,206.46,206.8,204.23,204.8508 511 | 2016-05-18,204.44,206.3,203.63,204.91 512 | 2016-05-19,204.06,204.54,202.78,204.2 513 | 2016-05-20,204.92,206.1,204.86,205.49 514 | 2016-05-23,205.51,205.84,204.985,205.21 515 | 2016-05-24,206.17,208.24,206.14,207.87 516 | 2016-05-25,208.67,209.77,207.8691,209.28 517 | 2016-05-26,209.44,209.71,208.97,209.34 518 | 2016-05-27,209.53,210.25,209.47,210.24 519 | 2016-05-31,210.56,210.69,209.18,209.84 520 | 2016-06-01,209.12,210.48,208.89,210.27 521 | 2016-06-02,209.8,210.93,209.2399,210.91 522 | 2016-06-03,210.25,210.69,208.86,210.28 523 | 2016-06-06,210.7,211.77,210.51,211.35 524 | 2016-06-07,211.525,212.34,211.5,211.68 525 | 2016-06-08,211.84,212.52,211.6899,212.37 526 | 2016-06-09,211.51,212.22,211.19,212.08 527 | 2016-06-10,210.46,210.86,209.43,210.07 528 | 2016-06-13,209.36,210.37,208.35,208.4492 529 | 2016-06-14,208,208.74,206.9199,208.04 530 | 2016-06-15,208.54,209.36,207.53,207.75 531 | 2016-06-16,206.73,208.57,205.59,208.37 532 | 2016-06-17,207.17,207.2,205.75,206.52 533 | 2016-06-20,208.82,209.61,207.75,207.85 534 | 2016-06-21,208.3,208.92,207.78,208.44 535 | 2016-06-22,208.65,209.5,207.93,208.1 536 | 2016-06-23,209.81,210.87,209.27,210.81 537 | 2016-06-24,203.63,210.8463,202.72,203.13 538 | 2016-06-27,201.59,201.6,198.65,199.6 539 | 2016-06-28,201.48,203.23,201.12,203.1997 540 | 2016-06-29,204.84,206.93,204.72,206.66 541 | 2016-06-30,207.21,209.54,206.56,209.475 542 | 2016-07-01,209.36,210.49,209.29,209.9208 543 | 2016-07-05,208.95,209.08,207.71,208.41 544 | 2016-07-06,207.83,209.8,207.06,209.66 545 | 2016-07-07,209.87,210.6495,208.63,209.526 546 | 2016-07-08,211.05,212.94,210.7785,212.65 547 | 2016-07-11,213.19,214.07,212.95,213.4 548 | 2016-07-12,214.53,215.3,213.4308,214.95 549 | 2016-07-13,215.44,215.45,214.35,214.92 550 | 2016-07-14,216.4,216.67,215.66,216.12 551 | 2016-07-15,216.78,217.0125,215.308,215.83 552 | 2016-07-18,215.97,216.6,215.67,216.4092 553 | 2016-07-19,215.92,216.23,215.63,216.19 554 | 2016-07-20,216.75,217.37,216.24,217.085 555 | 2016-07-21,216.96,217.22,215.75,216.265 556 | 2016-07-22,216.41,217.3,216.1,217.24 557 | 2016-07-25,217,217.06,215.97,216.65 558 | 2016-07-26,216.53,217.17,215.76,216.75 559 | 2016-07-27,217.19,217.27,215.62,216.52 560 | 2016-07-28,216.29,217.11,215.75,216.77 561 | 2016-07-29,216.46,217.54,216.13,217.12 562 | 2016-08-01,217.19,217.65,216.405,216.94 563 | 2016-08-02,216.65,216.83,214.57,215.5492 564 | 2016-08-03,215.48,216.245,215.13,216.18 565 | 2016-08-04,216.31,216.78,214.25,216.4097 566 | 2016-08-05,217.21,218.23,217.07,218.18 567 | 2016-08-08,218.4,218.52,217.74,218.05 568 | 2016-08-09,218.13,218.76,217.8,218.18 569 | 2016-08-10,218.31,218.4038,217.23,217.64 570 | 2016-08-11,218.26,218.94,217.95,218.65 571 | 2016-08-12,218.29,218.71,217.99,218.46 572 | 2016-08-15,218.89,219.5,218.88,219.09 573 | 2016-08-16,218.6,218.68,217.96,217.96 574 | 2016-08-17,218,218.53,217.02,218.37 575 | 2016-08-18,218.34,218.9,218.21,218.86 576 | 2016-08-19,218.31,218.75,217.74,218.54 577 | 2016-08-22,218.26,218.8,217.83,218.53 578 | 2016-08-23,219.25,219.6,218.9,218.97 579 | 2016-08-24,218.8,218.91,217.36,217.85 580 | 2016-08-25,217.4,218.19,217.22,217.7 581 | 2016-08-26,217.92,219.12,216.25,217.29 582 | 2016-08-29,217.44,218.665,217.4,218.3608 583 | 2016-08-30,218.26,218.59,217.35,218 584 | 2016-08-31,217.61,217.75,216.465,217.38 585 | 2016-09-01,217.37,217.73,216.03,217.39 586 | 2016-09-02,218.39,218.87,217.7,218.37 587 | 2016-09-06,218.7,219.12,217.86,219.0308 588 | 2016-09-07,218.84,219.22,218.3,219.01 589 | 2016-09-08,218.62,218.94,218.15,218.51 590 | 2016-09-09,216.97,217.03,213.25,213.28 591 | 2016-09-12,212.39,216.81,212.31,216.34 592 | 2016-09-13,214.84,215.1499,212.5,213.23 593 | 2016-09-14,213.29,214.7,212.5,213.15 594 | 2016-09-15,212.96,215.73,212.75,215.28 595 | 2016-09-16,213.48,213.69,212.57,213.37 596 | 2016-09-19,214.13,214.88,213.03,213.41 597 | 2016-09-20,214.41,214.59,213.38,213.42 598 | 2016-09-21,214.24,216.03,213.44,215.82 599 | 2016-09-22,217,217.53,216.71,217.18 600 | 2016-09-23,216.72,216.88,215.88,215.99 601 | 2016-09-26,215.02,215.23,214.01,214.24 602 | 2016-09-27,214.05,215.68,213.62,215.57 603 | 2016-09-28,215.83,216.82,214.71,216.64 604 | 2016-09-29,216.4,216.87,214.04,214.68 605 | 2016-09-30,215.65,217.12,215.36,216.3 606 | 2016-10-03,215.82,216.04,215.04,215.78 607 | 2016-10-04,215.91,216.17,213.99,214.68 608 | 2016-10-05,215.41,216.13,215.33,215.63 609 | 2016-10-06,215.37,216.04,214.735,215.78 610 | 2016-10-07,216.1,216.3,214.19,215.04 611 | 2016-10-10,216.155,216.7,215.985,216.16 612 | 2016-10-11,215.66,215.74,212.58,213.43 613 | 2016-10-12,213.59,214.32,213.01,213.71 614 | 2016-10-13,212.16,213.59,211.21,213.01 615 | 2016-10-14,214.15,214.69,213.03,213.12 616 | 2016-10-17,213.09,213.39,212.17,212.38 617 | 2016-10-18,214.24,214.31,213.27,213.71 618 | 2016-10-19,214.02,214.64,213.6,214.28 619 | 2016-10-20,213.87,214.53,213.11,213.88 620 | 2016-10-21,212.96,214.08,212.76,213.98 621 | 2016-10-24,215,215.32,214.48,214.89 622 | 2016-10-25,214.68,214.98,213.98,214.17 623 | 2016-10-26,213.21,214.42,212.93,213.74 624 | 2016-10-27,214.58,214.62,213.08,213.17 625 | 2016-10-28,213.14,213.93,211.71,212.54 626 | 2016-10-31,212.93,213.19,212.36,212.55 627 | 2016-11-01,212.93,212.99,209.6,211.01 628 | 2016-11-02,210.65,211.1,209.23,209.74 629 | 2016-11-03,209.99,210.24,208.46,208.78 630 | 2016-11-04,208.91,209.89,208.38,208.55 631 | 2016-11-07,211.45,213.19,211.3,213.15 632 | 2016-11-08,212.69,214.77,212.38,214.11 633 | 2016-11-09,212.37,217.1,212.34,216.3792 634 | 2016-11-10,217.3,218.31,215.22,216.92 635 | 2016-11-11,216.08,216.7,215.32,216.42 636 | 2016-11-14,217.03,217.27,215.72,216.59 637 | 2016-11-15,217.04,218.28,216.8,218.28 638 | 2016-11-16,217.56,218.14,217.42,217.87 639 | 2016-11-17,218.05,219.06,217.92,218.99 640 | 2016-11-18,219.07,219.27,218.29,218.5 641 | 2016-11-21,219.17,220.18,219,220.15 642 | 2016-11-22,220.51,220.79,219.73,220.58 643 | 2016-11-23,219.98,220.76,219.75,220.7 644 | 2016-11-25,221.1,221.56,221.01,221.52 645 | 2016-11-28,221.16,221.48,220.36,220.48 646 | 2016-11-29,220.52,221.44,220.17,220.91 647 | 2016-11-30,221.63,221.82,220.31,220.38 648 | 2016-12-01,220.73,220.73,219.15,219.57 649 | 2016-12-02,219.67,220.25,219.26,219.68 650 | 2016-12-05,220.65,221.4,220.42,221 651 | 2016-12-06,221.22,221.7441,220.662,221.7 652 | 2016-12-07,221.52,224.67,221.38,224.6 653 | 2016-12-08,224.57,225.7,224.26,225.15 654 | 2016-12-09,225.41,226.53,225.37,226.51 655 | 2016-12-12,226.4,226.96,225.76,226.25 656 | 2016-12-13,227.02,228.34,227,227.76 657 | 2016-12-14,227.41,228.23,225.365,225.88 658 | 2016-12-15,226.16,227.81,225.8904,226.81 659 | 2016-12-16,226.01,226.08,224.67,225.04 660 | 2016-12-19,225.25,226.02,225.08,225.53 661 | 2016-12-20,226.15,226.57,225.88,226.4 662 | 2016-12-21,226.25,226.45,225.77,225.77 663 | 2016-12-22,225.6,225.74,224.92,225.38 664 | 2016-12-23,225.43,225.72,225.21,225.71 665 | 2016-12-27,226.02,226.73,226,226.27 666 | 2016-12-28,226.57,226.59,224.27,224.4 667 | 2016-12-29,224.48,224.89,223.84,224.35 668 | 2016-12-30,224.73,224.83,222.73,223.53 669 | 2017-01-03,225.04,225.83,223.8837,225.24 670 | 2017-01-04,225.62,226.75,225.61,226.58 671 | 2017-01-05,226.27,226.58,225.48,226.4 672 | 2017-01-06,226.53,227.75,225.9,227.21 673 | 2017-01-09,226.91,227.0701,226.4163,226.46 674 | 2017-01-10,226.48,227.45,226.01,226.46 675 | 2017-01-11,226.36,227.1,225.59,227.1 676 | 2017-01-12,226.5,226.75,224.955,226.53 677 | 2017-01-13,226.73,227.4,226.69,227.05 678 | 2017-01-17,226.31,226.78,225.8,226.25 679 | 2017-01-18,226.535,226.8,225.9,226.75 680 | 2017-01-19,226.84,227,225.41,225.91 681 | 2017-01-20,226.7,227.31,225.9719,226.74 682 | 2017-01-23,226.35,226.805,225.27,226.15 683 | 2017-01-24,226.4,228.08,226.27,227.6 684 | 2017-01-25,228.7,229.57,228.51,229.57 685 | 2017-01-26,229.4,229.71,229.01,229.33 686 | 2017-01-27,229.42,229.59,228.76,228.97 687 | 2017-01-30,228.17,228.2,226.41,227.55 688 | 2017-01-31,226.98,227.6,226.32,227.53 689 | 2017-02-01,228.255,228.59,226.94,227.62 690 | 2017-02-02,227.2,228.1,226.82,227.77 691 | 2017-02-03,228.82,229.55,228.46,229.34 692 | 2017-02-06,228.87,229.326,228.54,228.93 693 | 2017-02-07,229.38,229.6556,228.72,228.94 694 | 2017-02-08,228.61,229.39,228.31,229.24 695 | 2017-02-09,229.56,230.95,229.52,230.6 696 | 2017-02-10,231,231.77,230.6216,231.51 697 | 2017-02-13,232.08,233.07,232.05,232.77 698 | 2017-02-14,232.56,233.71,232.16,233.7 699 | 2017-02-15,233.45,235.14,233.39,234.92 700 | 2017-02-16,234.96,235.155,233.85,234.72 701 | 2017-02-17,233.95,235.09,233.93,235.09 702 | 2017-02-21,235.52,236.69,235.51,236.49 703 | 2017-02-22,236.02,236.54,235.83,236.28 704 | 2017-02-23,236.88,236.9,235.56,236.44 705 | 2017-02-24,235.46,236.7932,235.41,236.74 706 | 2017-02-27,236.64,237.31,236.35,237.11 707 | 2017-02-28,236.67,236.95,236.015,236.47 708 | 2017-03-01,238.39,240.32,238.37,239.78 709 | 2017-03-02,239.56,239.57,238.21,238.27 710 | 2017-03-03,238.17,238.61,237.73,238.42 711 | 2017-03-06,237.5,238.12,237.01,237.71 712 | 2017-03-07,237.36,237.77,236.76,237 713 | 2017-03-08,237.34,237.64,236.4,236.56 714 | 2017-03-09,236.7,237.24,235.74,236.86 715 | 2017-03-10,237.97,238.02,236.59,237.69 716 | 2017-03-13,237.62,237.86,237.24,237.81 717 | 2017-03-14,237.18,237.24,236.19,236.9 718 | 2017-03-15,237.56,239.44,237.29,238.95 719 | 2017-03-16,239.11,239.2,238.1,238.48 720 | 2017-03-17,237.75,237.97,237.03,237.03 721 | 2017-03-20,237.03,237.36,236.32,236.77 722 | 2017-03-21,237.47,237.61,233.58,233.73 723 | 2017-03-22,233.77,234.61,233.05,234.28 724 | 2017-03-23,234,235.34,233.6,234.03 725 | 2017-03-24,234.38,235.04,232.96,233.86 726 | 2017-03-27,231.93,233.92,231.61,233.62 727 | 2017-03-28,233.27,235.81,233.14,235.32 728 | 2017-03-29,234.99,235.81,234.725,235.54 729 | 2017-03-30,235.47,236.52,235.27,236.29 730 | 2017-03-31,235.9,236.51,235.68,235.74 731 | 2017-04-03,235.8,236.03,233.91,235.33 732 | 2017-04-04,235,235.58,234.555,235.48 733 | 2017-04-05,236.26,237.39,234.54,234.78 734 | 2017-04-06,234.94,236.04,234.425,235.44 735 | 2017-04-07,235.15,236,234.64,235.2 736 | 2017-04-10,235.36,236.255,234.73,235.34 737 | 2017-04-11,234.9,235.18,233.34,235.06 738 | 2017-04-12,234.74,234.96,233.77,234.03 739 | 2017-04-13,233.64,234.49,232.51,232.51 740 | 2017-04-17,233.11,234.57,232.88,234.57 741 | 2017-04-18,233.72,234.49,233.08,233.87 742 | 2017-04-19,234.52,234.95,233.18,233.44 743 | 2017-04-20,234.15,235.845,233.78,235.34 744 | 2017-04-21,235.25,235.31,234.13,234.59 745 | 2017-04-24,237.18,237.41,234.5628,237.17 746 | 2017-04-25,237.91,238.95,237.81,238.55 747 | 2017-04-26,238.51,239.53,238.35,238.4 748 | 2017-04-27,238.77,238.95,237.98,238.6 749 | 2017-04-28,238.9,238.93,237.93,238.08 750 | 2017-05-01,238.68,239.17,238.195,238.68 751 | 2017-05-02,238.84,238.98,238.3,238.77 752 | 2017-05-03,238.29,238.8775,237.7,238.48 753 | 2017-05-04,238.83,238.9225,237.78,238.76 754 | 2017-05-05,239.19,239.72,238.68,239.7 755 | 2017-05-08,239.75,239.92,239.17,239.66 756 | 2017-05-09,239.96,240.19,239.04,239.44 757 | 2017-05-10,239.39,239.87,239.15,239.87 758 | 2017-05-11,239.35,239.57,238.13,239.38 759 | 2017-05-12,239.09,239.4273,238.67,238.98 760 | 2017-05-15,239.47,240.44,239.45,240.3 761 | 2017-05-16,240.64,240.67,239.63,240.08 762 | 2017-05-17,238.1,238.64,235.75,235.82 763 | 2017-05-18,235.73,237.75,235.43,236.77 764 | 2017-05-19,237.33,239.08,237.27,238.31 765 | 2017-05-22,238.9,239.71,238.82,239.52 766 | 2017-05-23,239.95,240.24,239.51,240.05 767 | 2017-05-24,240.32,240.73,239.93,240.61 768 | 2017-05-25,241.2,242.08,240.96,241.76 769 | 2017-05-26,241.54,241.9,241.45,241.71 770 | 2017-05-30,241.34,241.79,241.16,241.5 771 | 2017-05-31,241.84,241.88,240.64,241.44 772 | 2017-06-01,241.97,243.38,241.64,243.36 773 | 2017-06-02,243.42,244.35,243.08,244.17 774 | 2017-06-05,243.97,244.3,243.76,243.99 775 | 2017-06-06,243.34,243.98,243.12,243.21 776 | 2017-06-07,243.6,243.92,242.83,243.66 777 | 2017-06-08,243.77,244.33,243.17,243.78 778 | 2017-06-09,244.09,245.01,241.95,243.41 779 | 2017-06-12,243.13,243.42,242.38,243.36 780 | 2017-06-13,243.98,244.61,243.5799,244.55 781 | 2017-06-14,244.86,244.87,243.29,244.24 782 | 2017-06-15,242.68,243.91,242.36,243.77 783 | 2017-06-16,242.77,242.83,241.6337,242.64 784 | 2017-06-19,243.59,244.73,243.48,244.66 785 | 2017-06-20,244.25,244.26,242.99,243.01 786 | 2017-06-21,243.42,243.59,242.41,242.95 787 | 2017-06-22,242.96,243.53,242.64,242.84 788 | 2017-06-23,242.91,243.51,242.47,243.13 789 | 2017-06-26,243.9,244.38,243.045,243.29 790 | 2017-06-27,243.04,243.38,241.31,241.33 791 | 2017-06-28,242.5,243.715,242.23,243.49 792 | 2017-06-29,243.66,243.72,239.955,241.35 793 | 2017-06-30,242.28,242.71,241.575,241.8 794 | 2017-07-03,242.88,243.38,242.21,242.21 795 | 2017-07-05,242.63,243.01,241.7,242.77 796 | 2017-07-06,241.89,242.03,240.34,240.55 797 | 2017-07-07,241.21,242.28,240.5645,242.11 798 | 2017-07-10,241.95,242.8,241.76,242.37 799 | 2017-07-11,242.16,242.55,240.85,242.19 800 | 2017-07-12,243.3,244.2,243.3,244.01 801 | 2017-07-13,244.02,244.55,243.76,244.42 802 | 2017-07-14,244.43,245.97,244.31,245.56 803 | 2017-07-17,245.47,245.91,245.33,245.53 804 | 2017-07-18,245.06,245.72,244.67,245.66 805 | 2017-07-19,246.02,247,246.01,246.99 806 | 2017-07-20,247.28,247.42,246.47,247.1 807 | 2017-07-21,246.44,246.91,246.18,246.88 808 | 2017-07-24,246.79,246.98,246.28,246.82 809 | 2017-07-25,247.68,247.8,247.16,247.42 810 | 2017-07-26,247.75,247.79,247.13,247.43 811 | 2017-07-27,247.96,248,245.68,247.2 812 | 2017-07-28,246.65,247.06,246.13,246.91 813 | 2017-07-31,247.37,247.48,246.53,246.77 814 | 2017-08-01,247.46,247.5,246.716,247.32 815 | 2017-08-02,247.47,247.6,246.37,247.44 816 | 2017-08-03,247.31,247.34,246.64,246.96 817 | 2017-08-04,247.52,247.79,246.97,247.41 818 | 2017-08-07,247.49,247.87,247.37,247.87 819 | 2017-08-08,247.51,248.91,246.83,247.26 820 | 2017-08-09,246.47,247.31,246.06,247.25 821 | 2017-08-10,246.29,246.44,243.7,243.76 822 | 2017-08-11,244.02,244.8,243.75,244.12 823 | 2017-08-14,245.59,246.79,245.55,246.54 824 | 2017-08-15,246.98,247,246.16,246.51 825 | 2017-08-16,247.11,247.57,246.45,246.94 826 | 2017-08-17,246.24,246.6,243.09,243.09 827 | 2017-08-18,242.9,244.189,242.2,242.71 828 | 2017-08-21,242.64,243.2,241.83,242.9 829 | 2017-08-22,243.57,245.62,243.55,245.44 830 | 2017-08-23,244.33,245.05,244.16,244.56 831 | 2017-08-24,245,245.18,243.75,243.99 832 | 2017-08-25,244.9,245.61,244.39,244.56 833 | 2017-08-28,245.17,245.2,244.09,244.57 834 | 2017-08-29,243.06,245.15,242.93,244.85 835 | 2017-08-30,244.83,246.32,244.62,246.01 836 | 2017-08-31,246.72,247.77,246.0473,247.49 837 | 2017-09-01,247.92,248.33,247.67,247.84 838 | 2017-09-05,247.26,247.52,244.95,246.06 839 | 2017-09-06,246.84,247.28,246.23,246.9 840 | 2017-09-07,247.25,247.27,246.4,246.87 841 | 2017-09-08,246.54,247.11,246.3,246.58 842 | 2017-09-11,248.04,249.3,248.02,249.21 843 | 2017-09-12,249.63,250.09,249.42,250.05 844 | 2017-09-13,249.72,250.21,249.59,250.17 845 | 2017-09-14,249.8,250.32,249.6,250.09 846 | 2017-09-15,248.69,249.29,248.57,249.19 847 | 2017-09-18,249.61,250.12,249.28,249.72 848 | 2017-09-19,250,250.07,249.6,249.97 849 | 2017-09-20,250.07,250.19,248.92,250.06 850 | 2017-09-21,249.88,249.98,249.185,249.39 851 | 2017-09-22,249.05,249.63,249.02,249.44 852 | 2017-09-25,249.15,249.5532,248.08,248.93 853 | 2017-09-26,249.42,249.7,248.805,249.08 854 | 2017-09-27,249.88,250.49,248.87,250.05 855 | 2017-09-28,249.73,250.44,249.63,250.35 856 | 2017-09-29,250.34,251.32,250.13,251.23 857 | 2017-10-02,251.49,252.32,251.2926,252.32 858 | 2017-10-03,252.46,252.89,252.23,252.86 859 | 2017-10-04,252.69,253.44,252.56,253.16 860 | 2017-10-05,253.54,254.68,253.196,254.66 861 | 2017-10-06,254.15,254.7008,253.85,254.37 862 | 2017-10-09,254.63,254.7,253.65,253.95 863 | 2017-10-10,254.6,255.05,253.98,254.62 864 | 2017-10-11,254.51,255.02,254.32,255.02 865 | 2017-10-12,254.66,255.06,254.365,254.64 866 | 2017-10-13,255.14,255.27,254.64,254.95 867 | 2017-10-16,255.21,255.51,254.82,255.29 868 | 2017-10-17,255.23,255.52,254.98,255.47 869 | 2017-10-18,255.9,255.95,255.5,255.72 870 | 2017-10-19,254.83,255.83,254.35,255.79 871 | 2017-10-20,256.7,257.14,255.7744,257.11 872 | 2017-10-23,257.48,257.51,256.02,256.11 873 | 2017-10-24,256.6,256.83,256.15,256.56 874 | 2017-10-25,256.18,256.31,254,255.29 875 | 2017-10-26,255.99,256.3,255.48,255.62 876 | 2017-10-27,256.47,257.89,255.6254,257.71 877 | 2017-10-30,257.07,257.6,256.41,256.75 878 | 2017-10-31,257.18,257.44,256.805,257.15 879 | 2017-11-01,258.04,258.43,257.07,257.49 880 | 2017-11-02,257.41,257.75,256.19,257.59 881 | 2017-11-03,257.77,258.5,257.3,258.45 882 | 2017-11-06,258.3,259,258.22,258.85 883 | 2017-11-07,258.97,259.35,258.09,258.67 884 | 2017-11-08,258.47,259.22,258.15,259.11 885 | 2017-11-09,257.73,258.39,256.36,258.17 886 | 2017-11-10,257.73,258.2926,257.37,258.09 887 | 2017-11-13,257.31,258.59,257.27,258.33 888 | 2017-11-14,257.41,257.85,256.52,257.73 889 | 2017-11-15,256.62,257.22,255.63,256.44 890 | 2017-11-16,257.52,259.04,257.4748,258.62 891 | 2017-11-17,258.22,258.5882,257.77,257.86 892 | 2017-11-20,258.14,258.525,257.86,258.3 893 | 2017-11-21,259.18,260.2,258.2627,259.99 894 | 2017-11-22,260,260.15,259.57,259.76 895 | 2017-11-24,260.32,260.48,260.16,260.36 896 | 2017-11-27,260.41,260.75,260,260.23 897 | 2017-11-28,260.76,262.9,260.655,262.87 898 | 2017-11-29,263.02,263.63,262.2,262.71 899 | 2017-11-30,263.76,266.05,263.67,265.01 900 | 2017-12-01,264.76,265.31,260.76,264.46 901 | 2017-12-04,266.31,266.8,264.08,264.14 902 | 2017-12-05,264.43,265.15,263.04,263.19 903 | 2017-12-06,262.87,263.73,262.71,263.24 904 | 2017-12-07,263.09,264.43,262.94,264.07 905 | 2017-12-08,264.99,265.52,264.0315,265.51 906 | 2017-12-11,265.58,266.38,265.4793,266.31 907 | 2017-12-12,266.57,267.32,266.345,266.78 908 | 2017-12-13,267.06,267.56,266.65,266.75 909 | 2017-12-14,267.09,267.22,265.6,265.66 910 | 2017-12-15,265.45,267.04,265.39,266.51 911 | 2017-12-18,268.1,268.6,267.98,268.2 912 | 2017-12-19,268.48,268.53,267.09,267.17 913 | 2017-12-20,268.27,268.33,266.69,267.03 914 | 2017-12-21,267.74,268.385,267.3,267.58 915 | 2017-12-22,267.6,267.635,266.9,267.51 916 | 2017-12-26,267.05,267.4377,266.885,267.19 917 | 2017-12-27,267.38,267.73,267.01,267.32 918 | 2017-12-28,267.89,267.92,267.45,267.87 919 | 2017-12-29,268.53,268.55,266.64,266.86 920 | 2018-01-02,267.84,268.81,267.4,268.77 921 | 2018-01-03,268.96,270.64,268.96,270.47 922 | 2018-01-04,271.2,272.16,270.5447,271.61 923 | 2018-01-05,272.51,273.56,271.95,273.42 924 | 2018-01-08,273.31,274.1,272.98,273.92 925 | 2018-01-09,274.4,275.25,274.081,274.54 926 | 2018-01-10,273.68,274.42,272.92,274.12 927 | 2018-01-11,274.75,276.12,274.56,276.12 928 | 2018-01-12,276.42,278.11,276.0819,277.92 929 | 2018-01-16,279.35,280.09,276.18,276.97 930 | 2018-01-17,278.03,280.05,276.97,279.61 931 | 2018-01-18,279.48,279.96,278.58,279.14 932 | 2018-01-19,279.8,280.41,279.14,280.41 933 | 2018-01-22,280.17,282.69,280.11,282.69 934 | 2018-01-23,282.74,283.62,282.37,283.29 935 | 2018-01-24,284.02,284.7,281.84,283.18 936 | 2018-01-25,284.16,284.27,282.405,283.3 937 | 2018-01-26,284.25,286.6285,283.96,286.58 938 | 2018-01-29,285.93,286.43,284.5,284.68 939 | 2018-01-30,282.6,284.736,281.22,281.76 940 | 2018-01-31,282.73,283.3,280.68,281.9 941 | 2018-02-01,281.07,283.06,280.68,281.58 942 | 2018-02-02,280.08,280.23,275.41,275.45 943 | 2018-02-05,273.45,275.85,263.31,263.93 944 | 2018-02-06,259.94,269.7,258.7,269.13 945 | 2018-02-07,268.5,272.36,267.58,267.67 946 | 2018-02-08,268.01,268.17,257.59,257.63 947 | 2018-02-09,260.8,263.61,252.92,261.5 948 | 2018-02-12,263.83,267.01,261.6644,265.34 949 | 2018-02-13,263.97,266.62,263.31,266 950 | 2018-02-14,264.31,270,264.3,269.59 951 | 2018-02-15,271.57,273.04,268.77,273.03 952 | 2018-02-16,272.32,275.32,272.27,273.11 953 | 2018-02-20,272.03,273.67,270.5,271.4 954 | 2018-02-21,271.9,274.72,269.94,270.05 955 | 2018-02-22,271.1,273.05,269.64,270.4 956 | 2018-02-23,271.79,274.71,271.25,274.71 957 | 2018-02-26,275.93,278.01,275.26,277.9 958 | 2018-02-27,278.11,278.92,274.36,274.43 959 | 2018-02-28,275.68,276.19,271.29,271.65 960 | 2018-03-01,271.41,273.17,266,267.7 961 | 2018-03-02,265.8,269.72,264.82,269.08 962 | 2018-03-05,267.73,272.89,267.61,272.19 963 | 2018-03-06,273.3,273.39,271.18,272.88 964 | 2018-03-07,270.42,273.18,270.2,272.78 965 | 2018-03-08,273.55,274.24,272.42,274.1 966 | 2018-03-09,275.7,278.87,275.34,278.87 967 | 2018-03-12,279.2,279.91,278.0801,278.52 968 | 2018-03-13,279.84,280.41,276.03,276.72 969 | 2018-03-14,277.81,278.02,274.67,275.3 970 | 2018-03-15,275.88,276.61,274.43,275 971 | 2018-03-16,274.5,275.39,274.14,274.2 972 | 2018-03-19,273.35,274.3957,268.62,270.49 973 | 2018-03-20,270.94,271.67,270.18,270.95 974 | 2018-03-21,270.9,273.27,270.19,270.43 975 | 2018-03-22,267.91,268.87,263.36,263.67 976 | 2018-03-23,264.17,265.02,257.83,258.05 977 | 2018-03-26,262.13,265.43,259.41,265.11 978 | 2018-03-27,266.17,266.77,258.84,260.6 979 | 2018-03-28,260.75,262.64,258.58,259.83 980 | 2018-03-29,261.12,265.26,259.8389,263.15 981 | 2018-04-02,262.55,263.13,254.67,257.47 982 | 2018-04-03,258.87,261.31,256.84,260.77 983 | 2018-04-04,256.75,264.355,256.6,263.56 984 | 2018-04-05,265.55,266.64,264.32,265.64 985 | 2018-04-06,263.42,265.11,258,259.72 986 | 2018-04-09,261.37,264.84,259.9356,261 987 | 2018-04-10,264.27,266.04,262.98,265.15 988 | 2018-04-11,263.47,265.64,263.39,263.76 989 | 2018-04-12,265.26,267,265.06,265.93 990 | 2018-04-13,267.41,267.54,264.01,265.15 991 | 2018-04-16,267,268.2,266.07,267.33 992 | 2018-04-17,269.33,270.87,268.75,270.19 993 | 2018-04-18,270.69,271.3,269.87,270.39 994 | 2018-04-19,269.65,269.88,267.72,268.89 995 | 2018-04-20,268.81,269.06,265.61,266.61 996 | 2018-04-23,267.26,267.89,265.35,266.57 997 | 2018-04-24,267.73,267.9762,261.28,262.98 998 | 2018-04-25,262.91,264.13,260.85,263.63 999 | 2018-04-26,264.79,267.2452,264.29,266.31 1000 | 2018-04-27,267,267.34,265.5,266.56 1001 | 2018-04-30,267.26,267.89,264.43,264.51 1002 | 2018-05-01,263.87,265.1,262.11,264.98 1003 | 2018-05-02,264.76,265.68,262.76,263.2 1004 | 2018-05-03,262.26,263.36,259.05,262.62 1005 | 2018-05-04,261.52,266.7892,261.15,266.02 1006 | 2018-05-07,266.89,268.02,266.11,266.92 1007 | 2018-05-08,266.5,267.325,265.15,266.92 1008 | 2018-05-09,267.68,269.865,267.09,269.5 1009 | 2018-05-10,270.34,272.39,270.22,272.02 1010 | 2018-05-11,272.16,273.15,271.58,272.85 1011 | 2018-05-14,273.34,274.08,272.36,272.98 1012 | 2018-05-15,271.59,271.61,270.03,271.1 1013 | 2018-05-16,271.14,272.76,271.11,272.24 1014 | 2018-05-17,271.94,273.23,271.13,272.01 1015 | 2018-05-18,271.62,272.03,270.93,271.33 1016 | 2018-05-21,273.01,273.98,271.3512,273.37 1017 | 2018-05-22,273.96,274.25,272.24,272.61 1018 | 2018-05-23,271.17,273.39,270.99,273.36 1019 | 2018-05-24,272.91,273.22,270.78,272.8 1020 | 2018-05-25,272.15,272.86,271.58,272.15 1021 | 2018-05-29,270.31,271.17,267.76,269.02 1022 | 2018-05-30,270.5,273.11,270.42,272.61 1023 | 2018-05-31,272.15,272.49,270.255,270.94 1024 | 2018-06-01,272.41,273.94,272.33,273.6 1025 | 2018-06-04,274.53,275.185,274.26,274.9 1026 | 2018-06-05,275.05,275.53,274.18,275.1 1027 | 2018-06-06,275.79,277.52,275.09,277.4 1028 | 2018-06-07,277.95,278.28,276.34,277.37 1029 | 2018-06-08,276.85,278.25,276.66,278.19 1030 | 2018-06-11,278.44,279.37,278.31,278.56 1031 | 2018-06-12,279.03,279.33,278.19,278.92 1032 | 2018-06-13,279.19,279.48,277.8,278.03 1033 | 2018-06-14,279.01,279.33,278.0599,278.73 1034 | 2018-06-15,276.6,277.51,275.35,277.13 1035 | 2018-06-18,275.49,276.7,274.95,276.56 1036 | 2018-06-19,274,275.75,273.53,275.5 1037 | 2018-06-20,276.27,276.72,275.59,275.97 1038 | 2018-06-21,275.96,275.98,273.68,274.24 1039 | 2018-06-22,275.66,275.785,274.49,274.74 1040 | 2018-06-25,273.44,273.6162,269.1,271 1041 | 2018-06-26,271.64,272.56,270.79,271.6 1042 | 2018-06-27,272.26,273.865,269.18,269.35 1043 | 2018-06-28,269.29,271.75,268.49,270.89 1044 | 2018-06-29,272.12,273.66,271.1495,271.28 1045 | 2018-07-02,269.51,272.04,269.24,271.86 1046 | 2018-07-03,272.87,272.98,270.42,270.9 1047 | 2018-07-05,272.17,273.18,270.96,273.11 1048 | 2018-07-06,273.14,275.84,272.715,275.42 1049 | 2018-07-09,276.55,277.96,276.5,277.9 1050 | 2018-07-10,278.41,279.01,278.08,278.9 1051 | 2018-07-11,277.15,278.04,276.52,276.86 1052 | 2018-07-12,278.28,279.43,277.6,279.37 1053 | 2018-07-13,279.17,279.93,278.66,279.59 1054 | 2018-07-16,279.64,279.803,278.84,279.34 1055 | 2018-07-17,278.47,280.91,278.41,280.47 1056 | 2018-07-18,280.56,281.18,280.06,281.06 1057 | 2018-07-19,280.31,280.74,279.46,280 1058 | 2018-07-20,279.77,280.48,279.5,279.68 1059 | 2018-07-23,279.45,280.43,279.06,280.2 1060 | 2018-07-24,281.79,282.56,280.63,281.61 1061 | 2018-07-25,281.33,284.37,281.28,284.01 1062 | 2018-07-26,283.2,284.11,283.09,283.34 1063 | 2018-07-27,283.71,283.82,280.38,281.42 1064 | 2018-07-30,281.51,281.69,279.36,279.95 1065 | 2018-07-31,280.81,282.02,280.38,281.33 1066 | 2018-08-01,281.56,282.13,280.1315,280.86 1067 | 2018-08-02,279.39,282.58,279.16,282.39 1068 | 2018-08-03,282.53,283.6577,282.33,283.6 1069 | 2018-08-06,283.64,284.99,283.2015,284.64 1070 | 2018-08-07,285.39,286.01,285.24,285.58 1071 | 2018-08-08,285.39,285.91,284.94,285.46 1072 | 2018-08-09,285.53,285.97,284.915,285.07 1073 | 2018-08-10,283.45,284.055,282.36,283.16 1074 | 2018-08-13,283.47,284.16,281.77,282.1 1075 | 2018-08-14,282.92,284.17,282.4833,283.9 1076 | 2018-08-15,282.38,282.54,280.16,281.78 1077 | 2018-08-16,283.4,285.04,283.36,284.06 1078 | 2018-08-17,283.83,285.5601,283.37,285.06 1079 | 2018-08-20,285.57,285.97,285.06,285.67 1080 | 2018-08-21,286.25,287.31,285.7135,286.34 1081 | 2018-08-22,285.88,286.76,285.575,286.17 1082 | 2018-08-23,285.97,286.94,285.43,285.79 1083 | 2018-08-24,286.44,287.67,286.38,287.51 1084 | 2018-08-27,288.86,289.9,288.68,289.78 1085 | 2018-08-28,290.3,290.4175,289.4,289.92 1086 | 2018-08-29,290.16,291.74,289.8854,291.48 1087 | 2018-08-30,290.94,291.36,289.63,290.3 1088 | 2018-08-31,289.84,290.81,289.29,290.31 1089 | 2018-09-04,289.84,290.21,288.68,289.81 1090 | 2018-09-05,289.41,289.64,287.89,289.03 1091 | 2018-09-06,289.15,289.49,287,288.16 1092 | 2018-09-07,286.98,288.7,286.71,287.6 1093 | 2018-09-10,288.74,289.04,287.88,288.1 1094 | 2018-09-11,287.37,289.55,286.975,289.05 1095 | 2018-09-12,289.06,289.8,288.23,289.12 1096 | 2018-09-13,290.32,291.0384,289.995,290.83 1097 | 2018-09-14,291.06,291.27,290,290.88 1098 | 2018-09-17,290.82,290.86,289.03,289.34 1099 | 2018-09-18,289.58,291.58,289.55,290.91 1100 | 2018-09-19,290.97,291.69,290.825,291.22 1101 | 2018-09-20,292.64,293.94,291.2363,293.58 1102 | 2018-09-21,293.09,293.22,291.81,291.99 1103 | 2018-09-24,291.34,291.5,290.37,291.02 1104 | 2018-09-25,291.53,291.65,290.4833,290.75 1105 | 2018-09-26,290.91,292.24,289.41,289.88 1106 | 2018-09-27,290.41,291.91,290.1,290.69 1107 | 2018-09-28,289.99,291.28,289.95,290.72 1108 | 2018-10-01,292.11,292.93,290.98,291.73 1109 | 2018-10-02,291.56,292.355,291.14,291.56 1110 | 2018-10-03,292.74,293.21,291.32,291.72 1111 | 2018-10-04,291.18,291.24,287.66,289.44 1112 | 2018-10-05,289.69,290.27,286.22,287.82 1113 | 2018-10-08,287.05,288.22,285.5,287.82 1114 | 2018-10-09,287.39,288.86,286.77,287.4 1115 | 2018-10-10,286.83,286.91,277.88,278.3 1116 | 2018-10-11,277.08,278.9,270.36,272.17 1117 | 2018-10-12,276.77,277.09,272.37,275.95 1118 | 2018-10-15,275.55,277.04,274.3,274.4 1119 | 2018-10-16,276.6,280.82,276.07,280.4 1120 | 2018-10-17,280.44,281.15,277.56,280.45 1121 | 2018-10-18,279.4,280.07,274.97,276.4 1122 | 2018-10-19,277.13,279.3,275.47,276.25 1123 | 2018-10-22,277,277.36,274.41,275.01 1124 | 2018-10-23,270.95,274.87,268.61,273.61 1125 | 2018-10-24,273.33,273.76,264.7,265.32 1126 | 2018-10-25,267.38,271.81,266.23,270.08 1127 | 2018-10-26,265.92,271,262.29,265.33 1128 | 2018-10-29,268.8,270.25,259.85,263.86 1129 | 2018-10-30,263.67,268.12,263.12,267.77 1130 | 2018-10-31,270.65,273.23,270.12,270.63 1131 | 2018-11-01,271.6,273.73,270.38,273.51 1132 | 2018-11-02,274.75,275.23,269.59,271.89 1133 | 2018-11-05,272.44,274.01,271.35,273.39 1134 | 2018-11-06,273.32,275.3,273.25,275.12 1135 | 2018-11-07,277.56,281.1,277.08,281.01 1136 | 2018-11-08,280.11,281.22,279.22,280.5 1137 | 2018-11-09,279.03,279.24,276.18,277.76 1138 | 2018-11-12,277.19,277.46,271.99,272.57 1139 | 2018-11-13,273.09,275.325,271.25,272.06 1140 | 2018-11-14,274.16,274.61,268.45,270.2 1141 | 2018-11-15,268.78,273.54,267.0102,273.02 1142 | 2018-11-16,271.79,274.75,271.21,273.73 1143 | 2018-11-19,273.05,273.38,268.07,269.1 1144 | 2018-11-20,265.36,267,263.15,264.12 1145 | 2018-11-21,265.86,267.15,265.01,265.02 1146 | 2018-11-23,263.18,264.8234,263.07,263.25 1147 | 2018-11-26,265.78,267.75,265.34,267.5 1148 | 2018-11-27,266.34,268.4,265.66,268.4 1149 | 2018-11-28,269.6,274.58,268.3272,274.58 1150 | 2018-11-29,273.71,275.55,272.43,273.98 1151 | 2018-11-30,273.81,276.28,273.45,275.65 1152 | 2018-12-03,280.28,280.4,277.505,279.3 1153 | 2018-12-04,278.37,278.85,269.9,270.25 1154 | 2018-12-06,265.92,269.97,262.44,269.84 1155 | 2018-12-07,269.46,271.22,262.63,263.57 1156 | 2018-12-10,263.37,265.1613,258.62,264.07 1157 | 2018-12-11,267.66,267.87,262.48,264.13 1158 | 2018-12-12,267.47,269,265.37,265.46 1159 | 2018-12-13,266.52,267.49,264.12,265.37 1160 | 2018-12-14,262.96,264.03,259.85,260.47 1161 | 2018-12-17,259.4,260.65,253.525,255.36 1162 | 2018-12-18,257.2,257.95,253.28,255.08 1163 | 2018-12-19,255.17,259.4,249.35,251.26 1164 | 2018-12-20,249.86,251.62,244.65,247.17 1165 | 2018-12-21,246.74,249.71,239.98,240.7 1166 | 2018-12-24,239.04,240.8355,234.27,234.34 1167 | 2018-12-26,235.97,246.18,233.76,246.18 1168 | 2018-12-27,242.57,248.29,238.96,248.07 1169 | 2018-12-28,249.58,251.4,246.45,247.75 1170 | 2018-12-31,249.56,250.19,247.47,249.92 1171 | 2019-01-02,245.98,251.21,245.95,250.18 1172 | 2019-01-03,248.23,248.57,243.67,244.21 1173 | 2019-01-04,247.59,253.11,247.17,252.39 1174 | 2019-01-07,252.69,255.95,251.69,254.38 1175 | 2019-01-08,256.82,257.31,254,256.77 1176 | 2019-01-09,257.56,258.91,256.19,257.97 1177 | 2019-01-10,256.26,259.16,255.5,258.88 1178 | 2019-01-11,257.68,259.0098,257.03,258.98 1179 | 2019-01-14,256.86,258.3,256.41,257.4 1180 | 2019-01-15,257.82,260.7,257.81,260.35 1181 | 2019-01-16,260.83,261.9666,260.6,260.98 1182 | 2019-01-17,260.01,263.92,259.96,262.96 1183 | 2019-01-18,264.98,266.98,262.998,266.46 1184 | 2019-01-22,264.82,265.06,261.06,262.86 1185 | 2019-01-23,264.01,264.79,260.66,263.41 1186 | 2019-01-24,263.21,264.2,262.08,263.55 1187 | 2019-01-25,265.61,266.7,263.6595,265.78 1188 | 2019-01-28,263.39,263.83,261.79,263.76 1189 | 2019-01-29,263.92,264.55,262.48,263.41 1190 | 2019-01-30,265.1,268.52,264.25,267.58 1191 | 2019-01-31,267.51,270.47,267.27,269.93 1192 | 2019-02-01,270.15,271.2,269.18,270.06 1193 | 2019-02-04,270.11,272.03,269.36,271.96 1194 | 2019-02-05,272.44,273.44,271.88,273.1 1195 | 2019-02-06,272.79,273.34,271.92,272.74 1196 | 2019-02-07,270.94,271.55,268.29,270.14 1197 | 2019-02-08,268.75,270.58,267.83,270.47 1198 | 2019-02-11,271.2,271.49,270.03,270.62 1199 | 2019-02-12,272.42,274.52,272.34,274.1 1200 | 2019-02-13,275.03,275.93,274.56,274.99 1201 | 2019-02-14,273.78,275.64,272.87,274.38 1202 | 2019-02-15,276.36,277.41,276.13,277.37 1203 | 2019-02-19,276.4813,278.58,276.47,277.85 1204 | 2019-02-20,277.81,278.92,277.25,278.41 1205 | 2019-02-21,277.7,278.1,276.345,277.42 1206 | 2019-02-22,278.11,279.36,277.4029,279.14 1207 | 2019-02-25,280.73,281.31,279.43,279.52 1208 | 2019-02-26,279.13,280.3,278.9,279.32 1209 | 2019-02-27,278.52,279.59,277.48,279.2 1210 | 2019-02-28,278.96,279.45,278.32,278.68 1211 | 2019-03-01,280.44,280.88,278.82,280.42 1212 | 2019-03-04,281.6,281.87,276.84,279.4 1213 | 2019-03-05,279.54,279.76,278.41,279.02 1214 | 2019-03-06,279.15,279.16,276.97,277.33 1215 | 2019-03-07,276.83,276.99,274.07,275.01 1216 | 2019-03-08,272.94,274.65,272.42,274.46 1217 | 2019-03-11,275.26,278.62,275.23,278.44 1218 | 2019-03-12,279.06,280.07,278.85,279.49 1219 | 2019-03-13,280.48,282.38,280.3,281.34 1220 | 2019-03-14,281.37,281.84,280.6662,281.16 1221 | 2019-03-15,280.54,282.21,280.33,281.31 1222 | 2019-03-18,281.55,282.66,281.3,282.33 1223 | 2019-03-19,283.51,284.36,281.41,282.4 1224 | 2019-03-20,282.16,283.5,280.32,281.55 1225 | 2019-03-21,280.64,285.18,280.59,284.73 1226 | 2019-03-22,283.22,283.8034,279.18,279.25 1227 | 2019-03-25,278.87,280.1853,277.64,279.04 1228 | 2019-03-26,280.99,282.18,279.56,281.12 1229 | 2019-03-27,281.11,281.76,277.93,279.65 1230 | 2019-03-28,280.35,281.21,279.07,280.71 1231 | 2019-03-29,282.39,282.84,281.14,282.48 1232 | 2019-04-01,284.7,286.16,284.4,285.83 1233 | 2019-04-02,286.04,286.23,285.09,285.97 1234 | 2019-04-03,287.32,287.76,285.75,286.42 1235 | 2019-04-04,286.78,287.459,286.01,287.18 1236 | 2019-04-05,287.92,288.63,287.6,288.57 1237 | 2019-04-08,288.1,288.91,287.37,288.79 1238 | 2019-04-09,287.72,288.08,286.7,287.31 1239 | 2019-04-10,287.77,288.3899,287.31,288.29 1240 | 2019-04-11,288.83,288.84,287.578,288.21 1241 | 2019-04-12,290,290.47,288.261,290.16 1242 | 2019-04-15,290.24,290.35,289.075,289.97 1243 | 2019-04-16,290.95,291.01,289.5,290.16 1244 | 2019-04-17,291.4,291.425,288.99,289.45 1245 | 2019-04-18,290.1,290.32,288.66,290.02 1246 | 2019-04-22,289.17,290.435,289.07,290.27 1247 | 2019-04-23,290.68,293.14,290.42,292.88 1248 | 2019-04-24,292.79,293.16,292.07,292.23 1249 | 2019-04-25,292.12,292.78,290.73,292.05 1250 | 2019-04-26,292.1,293.49,291.2401,293.41 1251 | 2019-04-29,293.51,294.45,293.41,293.87 1252 | 2019-04-30,293.49,294.34,291.92,294.02 1253 | 2019-05-01,294.72,294.95,291.8,291.81 1254 | 2019-05-02,291.68,292.7,289.52,291.18 1255 | 2019-05-03,292.82,294.34,291.2998,294.03 1256 | 2019-05-06,289.25,293.31,288.9,292.82 1257 | 2019-05-07,290.15,290.81,285.81,287.93 1258 | 2019-05-08,287.53,289.43,286.87,287.53 1259 | 2019-05-09,285.23,285.54,283.35,283.89 1260 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # [Trading Evolved](https://www.followingthetrend.com/trading-evolved/) 2 | [![Trading Evolved](https://m.media-amazon.com/images/I/41Ze8cqKMwL._SX260_.jpg)](https://amzn.to/2SphnLr) 3 | 4 | I have created this repo to host the code of this awesome book, to make it easier to lookup the notebooks and i plan to add CoLab integration too, with permission from [Andreas Clenow](https://www.followingthetrend.com/trading-evolved/#comment-94720) 5 | --------------------------------------------------------------------------------