├── .gitignore ├── README.md ├── app.py ├── conda.txt ├── data ├── .DS_Store ├── AAPL.csv ├── AAPL_2018.csv ├── AMZN.csv ├── AMZN_2018.csv ├── AMZN_2019.csv ├── AMZN_train.csv ├── CRM.csv ├── FB.csv ├── GOOG.csv ├── GOOG_1min.csv ├── GOOG_2018.csv ├── GOOG_2019.csv ├── HPQ.csv ├── IBM.csv ├── JNJ.csv ├── JPM.csv ├── MSFT.csv ├── NFLX.csv ├── SPY.csv ├── TSLA.csv ├── V.csv └── old_GOOG.csv ├── environment.yml ├── evaluate.py ├── how_it_works.py ├── models ├── AAPL ├── AMZN ├── FB ├── GOOG ├── IBM ├── JNJ ├── NFLX ├── SPY └── TSLA ├── public ├── AMZN_bad.png ├── GOOG.png ├── bad_benchmark.png ├── benchmark.png ├── ddqn.svg ├── ddqn_estimate.png ├── demo.gif ├── demo_model.gif ├── dqn.png └── rl_diagram.png ├── requirements.txt ├── src ├── BaselineModel.py ├── HeuristicTrader.py ├── agent.py ├── methods.py ├── technical_indicators.py └── utils.py └── train.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode 3 | .env 4 | *.ipynb 5 | *.pyc 6 | __pycache__ 7 | .ipynb_checkpoints 8 | src/__pycache__ 9 | main 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DeepRL Trader 2 | 3 | This application uses a deep reinforcement learning model [**Double Deep Q Network**](https://arxiv.org/abs/1509.06461) to generate an optimal set of trades that maximizes daily return. 4 | 5 | ### Contents 6 | - [DeepRL Trader](#deeprl-trader) 7 | - [Contents](#contents) 8 | - [Main Idea](#main-idea) 9 | - [Presentation Slides](#presentation-slides) 10 | - [Usage](#usage) 11 | - [Training](#training) 12 | - [Evaluation](#evaluation) 13 | - [Repository File Structure](#repository-file-structure) 14 | - [Results](#results) 15 | - [Q4 2010](#q4-2010) 16 | - [Trades](#trades) 17 | - [Benchmark Evaluation](#benchmark-evaluation) 18 | - [How It Works](#how-it-works) 19 | - [Data](#data) 20 | - [Acquisition](#acquisition) 21 | - [Feature Generation](#feature-generation) 22 | - [Training Data](#training-data) 23 | - [Test Data](#test-data) 24 | - [Model](#model) 25 | 26 | ## Main Idea 27 | 28 | 29 | 30 | This application takes a model free approach and develops a variation of Deep Q-Learning to estimate the optimal actions of a trader. 31 | 32 | The model is a FCN trained using *experience replay* and *Double DQN* with input features given by the current state of the limit order book, 33 additional technical indicators, and available execution actions, while the output is the Q-value function estimating the future rewards under an arbitrary action. 33 | 34 | We apply the model to ten stocks and observe that it does on occasion outperform the standard benchmark approach on most stocks using the measure of [**Sharpe Ratio**](https://www.investopedia.com/terms/s/sharperatio.asp). 35 | 36 | 37 | #### Presentation Slides 38 | 39 | Further details regarding the motivation, methods and results of implementation can be found in my presentation [here](http://bit.ly/Aaron-Mendonsa-DeepRLSlides). 40 | 41 | ## Usage 42 | 43 | 1. **To play interactively with the model, visit the deployed Streamlit app [here](http://bit.ly/DeepRLTrader)** 44 | 2. To run it locally: 45 | ```shell 46 | git clone https://github.com/DeepNeuralAI/RL-DeepQLearning-Trading.git 47 | conda env create -f environment.yml 48 | conda activate deepRLTrader 49 | streamlit run app.py 50 | ``` 51 | 52 | ### Training 53 | 54 | To train the model, use the following command: 55 | ```shell 56 | $ python3 train.py --train data/GOOG.csv --valid GOOG_2018.csv --episode-count 50 --window-size 10 57 | ``` 58 | 59 | ### Evaluation 60 | 61 | To evaluate the given model, use the following command: 62 | ```shell 63 | $ python3 evaluate.py --eval data/GOOG.csv --model-name GOOG --window-size 10 --verbose True 64 | ``` 65 | 66 | ### Repository File Structure 67 | 68 | ``` 69 | RL-DeepQLearning-Trading 70 | ├── README.md 71 | ├── app.py 72 | ├── conda.txt 73 | ├── data 74 | │   ├── CSV Data 75 | ├── evaluate.py 76 | ├── how_it_works.py 77 | ├── models 78 | │   ├── Models 79 | ├── public 80 | │   ├── Media Assets 81 | ├── requirements.txt 82 | ├── src 83 | │   ├── Helper Methods 84 | └── train.py 85 | ``` 86 | 87 | ## Results 88 | 89 | ![demo](public/demo_model.gif) 90 | 91 | ### Q4 2010 92 | 93 | #### Trades 94 | **Inputs**: Price & Volume 95 | 96 | The model outputs an optimal set of trades (**Buy/Sell/Hold**), as observed in the figure below: 97 | 98 | 99 | #### Benchmark Evaluation 100 | Based upon the previous figure, the model calculates the normalized portfolio value for: 101 | 102 | * **Buy & Hold Strategy**: Baseline Model 103 | * **Heuristic**: 104 | * *Buy* if price below 2 standard deviations from the simple moving average 105 | * *Sell* if price above 2 standard deviations from the simple moving average 106 | * **Double DQN**: The trained policy of the Double Deep Q Network/RL Model 107 | 108 | 109 | 110 | ## How It Works 111 | 112 | ### Data 113 | 114 | #### Acquisition 115 | 116 | An API call is made to [AlphaVantage Stock Time Series Data](https://www.alphavantage.co/documentation/), specifically `TIME_SERIES_DAILY_ADJUSTED` 117 | 118 | This API returns daily time series (date, daily open, daily high, daily low, daily close, daily volume, daily adjusted close, and split/dividend events) of the global equity specified, covering 20+ years of historical data. 119 | 120 | The most recent data point is the prices and volume information of the current trading day, updated realtime. 121 | 122 | #### Feature Generation 123 | 124 | Technical indicators are derived from fundamental price and volume in the categories of: 125 | * Trend 126 | * Momentum 127 | * Volatility 128 | * Volume 129 | 130 | The data has a total of ***33 technical features*** and is then normalized and fed through the Double DQN 131 | 132 | #### Training Data 133 | 134 | The RL agent is trained on 7-10 years of historical data 135 | 136 | #### Test Data 137 | 138 | The RL agent is tested on an unseen set of 1-2 years of price/volume data. In most cases, this would be 2019 price/volume data 139 | 140 | ### Model 141 | 142 | 143 | 1. The Agent observes the environment, in the form of a state 144 | 2. Based on that state, the Agent takes a certain action based upon a policy 145 | 3. For that given action, and state, the Agent receives a reward from the environment. 146 | 4. The action mutates the environment to transition to a new state. 147 | 5. Repeat 148 | 149 | Q-learning is a model-free algorithm in RL for the purpose of learning a policy. The policy of an agent is arguably the most important as it is the policy that drives how the agent interacts with its environment. We define the "goodness" of an action by using the mathematical action-value function **Q(s,a)**. 150 | 151 | The higher the Q-value, the higher probability that given action _a_ in state _s_ will bring a higher reward _r_. 152 | 153 | We can use a table to store experience tuples, namely a _Q-table_, to take a discrete input of state _s_ and action _a_ and output an associated Q-value. The one limitation of this method, despite its intuitiveness, is the scalability. With continuous states such as a stock price, the computational space would be inefficient to store _n_ states by _m_ actions. Chess for example would take a 10^120 size states space. 154 | 155 | Instead of storing a massive lookup table, this project will approximate Q(s,a) with neural networks, namely a Deep Q Network (DQN) 156 | 157 | 158 | 159 | In 2015, Google DeepMind showed that in stochastic environments, Q-learning and DQN tends to overestimate and learn very poorly. From a high level perspective, these overestimations tend to result from a positive bias due to taking the maximum expected action value. 160 | 161 | [Hasselt, et.al](https://arxiv.org/abs/1509.06461) proposed using a double estimator to construct DQN and showed that the Double DQN (DDQN) converged to a more optimal policy and tended to estimate the true value more closely. 162 | 163 | The figure below is the implementation used in this application: 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import pandas as pd 3 | import numpy as np 4 | import keras.backend.tensorflow_backend as tb 5 | tb._SYMBOLIC_SCOPE.value = True 6 | 7 | from src.methods import evaluate_model 8 | from src.agent import RLAgent 9 | from src.BaselineModel import BaselineModel 10 | from src.HeuristicTrader import HeuristicTrader 11 | from how_it_works import how_it_works 12 | 13 | 14 | from src.utils import ( 15 | load_data, 16 | add_technical_features, 17 | show_evaluation_result, 18 | normalize, 19 | results_df, 20 | get_portfolio_stats, 21 | plot_trades, 22 | plot_benchmark 23 | ) 24 | 25 | @st.cache 26 | def load_data_(symbol, window_size): 27 | data_ = add_technical_features(load_data(f'data/{symbol}.csv'), window = window_size).sort_values(by=['Date'], ascending=True) 28 | return data_ 29 | 30 | @st.cache 31 | def filter_data_by_date(data, start_date, end_date): 32 | date_range = pd.date_range(start = start_date, end = end_date) 33 | return data.loc[date_range].dropna() 34 | 35 | def load_model(state_size, model_name): 36 | return RLAgent(state_size = window_size, pretrained = True, model_name = model_name) 37 | 38 | def evaluate(agent, test_data, window_size, verbose = True): 39 | result, history, shares = evaluate_model(agent, test_data, window_size, verbose) 40 | return result, history, shares 41 | 42 | def sidebar(index): 43 | start_date = st.sidebar.date_input('Start', index[0]) 44 | end_date = st.sidebar.date_input('End', index[-1]) 45 | window_size = st.sidebar.slider('Window Size', 1, 30, 10) 46 | return start_date, end_date, window_size 47 | 48 | def benchmarks(symbol, data, window_size = 10): 49 | baseline = BaselineModel(symbol, data, max_shares = 10) 50 | baseline_results = results_df(data.price, baseline.shares, starting_value = 1_000) 51 | heuristic = HeuristicTrader(symbol, data, window = window_size, max_shares = 10) 52 | heuristic_results = results_df(data.price, heuristic.shares, starting_value = 1_000) 53 | 54 | return baseline_results, heuristic_results 55 | 56 | # Streamlit App 57 | st.title('DeepRL Trader') 58 | st.subheader('Model uses Double Deep Q Network to generate a policy of optimal trades') 59 | 60 | symbols = ['AAPL', 'AMZN', 'FB', 'GOOG', 'IBM','JNJ', 'NFLX', 'SPY', 'TSLA'] 61 | symbol = st.sidebar.selectbox('Stock Symbol:', symbols) 62 | 63 | index = load_data_(symbol, 10).index 64 | start_date, end_date, window_size = sidebar(index) 65 | submit = st.sidebar.button('Run') 66 | if st.sidebar.checkbox('How Does This Work?'): 67 | how_it_works() 68 | 69 | 70 | 71 | if submit: 72 | model_name = symbol 73 | data = load_data_(symbol, window_size) 74 | filtered_data = filter_data_by_date(data, start_date, end_date) 75 | 76 | agent = load_model(filtered_data.shape[1], model_name = model_name) 77 | profit, history, shares = evaluate(agent, filtered_data, window_size = window_size, verbose = False) 78 | results = results_df(filtered_data.price, shares, starting_value = 1_000) 79 | cum_return, avg_daily_returns, std_daily_returns, sharpe_ratio = get_portfolio_stats(results.Port_Vals) 80 | 81 | st.write(f'### Cumulative Return for {symbol}: {np.around(cum_return * 100, 2)}%') 82 | fig = plot_trades(filtered_data, results.Shares, symbol) 83 | st.plotly_chart(fig) 84 | 85 | ## Benchmarking 86 | 87 | baseline_results, heuristic_results = benchmarks(symbol, filtered_data) 88 | 89 | cum_return_base, avg_daily_returns_base, std_daily_returns_base, sharpe_ratio_base = get_portfolio_stats(baseline_results.Port_Vals) 90 | cum_return_heuristic, avg_daily_returns_heuristic, std_daily_returns_heuristic, sharpe_ratio_heuristic = get_portfolio_stats(heuristic_results.Port_Vals) 91 | 92 | benchmark = pd.DataFrame(columns = ['Cumulative Return', 'Avg Daily Returns', 'Std Dev Daily Returns', 'Sharpe Ratio'], index = ['Double DQN', 'Buy & Hold', 'Heuristic']) 93 | benchmark.loc['Double DQN'] = [cum_return * 100, avg_daily_returns * 100, std_daily_returns, sharpe_ratio] 94 | benchmark.loc['Heuristic' ] = [cum_return_heuristic * 100, avg_daily_returns_heuristic * 100, std_daily_returns_heuristic, sharpe_ratio_heuristic] 95 | benchmark.loc['Buy & Hold'] = [cum_return_base * 100, avg_daily_returns_base * 100, std_daily_returns_base, sharpe_ratio_base] 96 | 97 | 98 | st.table(benchmark.astype('float64').round(4)) 99 | 100 | fig = plot_benchmark(baseline_results, heuristic_results, results) 101 | st.plotly_chart(fig) 102 | 103 | st.header('Raw Data') 104 | st.subheader('Double DQN') 105 | st.dataframe(results) 106 | 107 | st.subheader('Buy & Hold') 108 | st.write(baseline_results) 109 | 110 | st.subheader('Heuristic') 111 | st.write(heuristic_results) 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /conda.txt: -------------------------------------------------------------------------------- 1 | # This file may be used to create an environment using: 2 | # $ conda create --name --file 3 | # platform: osx-64 4 | _tflow_select=2.3.0=mkl 5 | absl-py=0.8.1=py37_0 6 | altair=4.0.1=pypi_0 7 | appnope=0.1.0=pypi_0 8 | astor=0.8.0=py37_0 9 | attrs=19.3.0=py_0 10 | backcall=0.1.0=py_0 11 | base58=2.0.0=pypi_0 12 | blas=1.0=mkl 13 | bleach=3.1.0=py_0 14 | blinker=1.4=pypi_0 15 | boto3=1.11.9=pypi_0 16 | botocore=1.14.9=pypi_0 17 | c-ares=1.15.0=h1de35cc_1001 18 | ca-certificates=2019.11.28=hecc5488_0 19 | certifi=2019.11.28=py37_0 20 | chardet=3.0.4=pypi_0 21 | click=7.0=pypi_0 22 | coloredlogs=10.0=pypi_0 23 | cycler=0.10.0=pypi_0 24 | cython=0.29.14=pypi_0 25 | decorator=4.4.1=py_0 26 | defusedxml=0.6.0=py_0 27 | docopt=0.6.2=pypi_0 28 | docutils=0.15.2=pypi_0 29 | entrypoints=0.3=py37_1000 30 | enum-compat=0.0.3=pypi_0 31 | future=0.18.2=pypi_0 32 | gast=0.2.2=py37_0 33 | google-pasta=0.1.8=py_0 34 | grpcio=1.16.1=py37h044775b_1 35 | h5py=2.9.0=py37h3134771_0 36 | hdf5=1.10.4=hfa1e0ec_0 37 | humanfriendly=4.18=pypi_0 38 | idna=2.8=pypi_0 39 | importlib-metadata=1.4.0=pypi_0 40 | importlib_metadata=1.5.0=py37_0 41 | inflect=4.0.0=py37_1 42 | intel-openmp=2019.4=233 43 | ipykernel=5.1.4=py37h5ca1d4c_0 44 | ipython=7.11.1=py37h5ca1d4c_0 45 | ipython-genutils=0.2.0=pypi_0 46 | ipython_genutils=0.2.0=py_1 47 | ipywidgets=7.5.1=pypi_0 48 | jaraco.itertools=5.0.0=py_0 49 | jedi=0.16.0=py37_0 50 | jinja2=2.10.3=pypi_0 51 | jmespath=0.9.4=pypi_0 52 | joblib=0.14.1=pypi_0 53 | json5=0.8.5=pypi_0 54 | jsonschema=3.2.0=py37_0 55 | jupyter-contrib-core=0.3.3=pypi_0 56 | jupyter-nbextensions-configurator=0.4.1=pypi_0 57 | jupyter_client=5.3.4=py37_1 58 | jupyter_core=4.6.1=py37_0 59 | jupyterlab-server=1.0.6=pypi_0 60 | keras=2.3.1=pypi_0 61 | keras-applications=1.0.8=py_0 62 | keras-preprocessing=1.1.0=py_1 63 | kiwisolver=1.1.0=pypi_0 64 | libcxx=4.0.1=hcfea43d_1 65 | libcxxabi=4.0.1=hcfea43d_1 66 | libedit=3.1.20181209=hb402a30_0 67 | libffi=3.2.1=h475c297_4 68 | libgfortran=3.0.1=h93005f0_2 69 | libprotobuf=3.11.2=hd9629dc_0 70 | libsodium=1.0.17=h01d97ff_0 71 | markdown=3.1.1=py37_0 72 | markupsafe=1.1.1=py37h0b31af3_0 73 | matplotlib=3.1.2=pypi_0 74 | mistune=0.8.4=py37h0b31af3_1000 75 | more-itertools=8.2.0=py_0 76 | nbconvert=5.6.1=py37_0 77 | nbformat=5.0.4=py_0 78 | ncurses=6.1=h0a44026_1 79 | notebook=6.0.3=py37_0 80 | numpy=1.18.1=py37h7241aed_0 81 | numpy-base=1.18.1=py37h6575580_1 82 | openssl=1.1.1d=h0b31af3_0 83 | opt_einsum=3.1.0=py_0 84 | pandas=0.25.3=pypi_0 85 | pandoc=2.9.1.1=0 86 | pandocfilters=1.4.2=pypi_0 87 | parso=0.6.0=py_0 88 | pathtools=0.1.2=pypi_0 89 | patsy=0.5.1=pypi_0 90 | pexpect=4.8.0=py37_0 91 | pickleshare=0.7.5=pypi_0 92 | pillow=7.0.0=pypi_0 93 | pip=20.0.2=py37_0 94 | plotly=4.5.0=pypi_0 95 | pmdarima=1.5.2=pypi_0 96 | prometheus_client=0.7.1=py_0 97 | prompt_toolkit=3.0.3=py_0 98 | protobuf=3.11.2=py37h0a44026_0 99 | ptyprocess=0.6.0=py_1001 100 | pydeck=0.2.1=pypi_0 101 | pygments=2.5.2=py_0 102 | pyobjc-core=6.1=pypi_0 103 | pyobjc-framework-cocoa=6.1=pypi_0 104 | pyobjc-framework-fsevents=6.1=pypi_0 105 | pyparsing=2.4.6=pypi_0 106 | pyrsistent=0.15.7=py37h0b31af3_0 107 | python=3.7.6=h359304d_2 108 | python-dateutil=2.8.0=pypi_0 109 | pytz=2019.3=pypi_0 110 | pyyaml=5.3=pypi_0 111 | pyzmq=18.1.1=pypi_0 112 | readline=7.0=h1de35cc_5 113 | requests=2.22.0=pypi_0 114 | retrying=1.3.3=pypi_0 115 | s3transfer=0.3.2=pypi_0 116 | scikit-learn=0.22.1=pypi_0 117 | scipy=1.3.1=py37h1410ff5_0 118 | seaborn=0.10.0=pypi_0 119 | send2trash=1.5.0=py_0 120 | setuptools=45.1.0=py37_0 121 | six=1.14.0=py37_0 122 | sklearn=0.0=pypi_0 123 | sqlite=3.30.1=ha441bb4_0 124 | statsmodels=0.11.0=pypi_0 125 | streamlit=0.53.0=pypi_0 126 | ta=0.5.11=pypi_0 127 | tensorboard=2.0.0=pyhb38c66f_1 128 | tensorboardx=2.0+a7f3124=pypi_0 129 | tensorflow=2.0.0=mkl_py37hda344b4_0 130 | tensorflow-base=2.0.0=mkl_py37h66b1bf0_0 131 | tensorflow-estimator=2.0.0=pyh2649769_0 132 | termcolor=1.1.0=py37_1 133 | terminado=0.8.3=pypi_0 134 | testpath=0.4.4=py_0 135 | tk=8.6.8=ha441bb4_0 136 | toml=0.10.0=pypi_0 137 | toolz=0.10.0=pypi_0 138 | tornado=5.1.1=pypi_0 139 | tqdm=4.42.0=pypi_0 140 | traitlets=4.3.3=py37_0 141 | tzlocal=2.0.0=pypi_0 142 | urllib3=1.25.8=pypi_0 143 | validators=0.14.2=pypi_0 144 | watchdog=0.10.0=pypi_0 145 | wcwidth=0.1.8=py_0 146 | webencodings=0.5.1=pypi_0 147 | werkzeug=0.16.0=py_0 148 | wheel=0.33.6=py37_0 149 | widgetsnbextension=3.5.1=pypi_0 150 | wrapt=1.11.2=py37h1de35cc_0 151 | xz=5.2.4=h1de35cc_4 152 | zeromq=4.3.2=h6de7cb9_2 153 | zipp=2.1.0=py_0 154 | zlib=1.2.11=h1de35cc_3 155 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/data/.DS_Store -------------------------------------------------------------------------------- /data/AAPL_2018.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Adj Close,Volume 2 | 2017-08-10,159.899994,160.000000,154.630005,155.320007,153.006531,40804300 3 | 2017-08-11,156.600006,158.570007,156.070007,157.479996,155.134338,26257100 4 | 2017-08-14,159.320007,160.210007,158.750000,159.850006,157.469070,22122700 5 | 2017-08-15,160.660004,162.199997,160.139999,161.600006,159.192978,29465500 6 | 2017-08-16,161.940002,162.509995,160.149994,160.949997,158.552673,27671600 7 | 2017-08-17,160.520004,160.710007,157.839996,157.860001,155.508698,27940600 8 | 2017-08-18,157.860001,159.500000,156.720001,157.500000,155.154068,27428100 9 | 2017-08-21,157.500000,157.889999,155.110001,157.210007,154.868378,26368500 10 | 2017-08-22,158.229996,160.000000,158.020004,159.779999,157.400101,21604600 11 | 2017-08-23,159.070007,160.470001,158.880005,159.979996,157.597107,19399100 12 | 2017-08-24,160.429993,160.740005,158.550003,159.270004,156.897690,19818900 13 | 2017-08-25,159.649994,160.559998,159.270004,159.860001,157.478897,25480100 14 | 2017-08-28,160.139999,162.000000,159.929993,161.470001,159.064911,25966000 15 | 2017-08-29,160.100006,163.119995,160.000000,162.910004,160.483490,29516900 16 | 2017-08-30,163.800003,163.889999,162.610001,163.350006,160.916916,27269600 17 | 2017-08-31,163.639999,164.520004,163.479996,164.000000,161.557236,26785100 18 | 2017-09-01,164.800003,164.940002,163.630005,164.050003,161.606491,16591100 19 | 2017-09-05,163.750000,164.250000,160.559998,162.080002,159.665848,29468500 20 | 2017-09-06,162.710007,162.990005,160.520004,161.910004,159.498367,21651700 21 | 2017-09-07,162.089996,162.240005,160.360001,161.259995,158.858032,21928500 22 | 2017-09-08,160.860001,161.149994,158.529999,158.630005,156.267227,28611500 23 | 2017-09-11,160.500000,162.050003,159.889999,161.500000,159.094467,31085900 24 | 2017-09-12,162.610001,163.960007,158.770004,160.860001,158.464020,71714000 25 | 2017-09-13,159.869995,159.960007,157.910004,159.649994,157.272018,44907400 26 | 2017-09-14,158.990005,159.399994,158.089996,158.279999,155.922440,23760700 27 | 2017-09-15,158.470001,160.970001,158.000000,159.880005,157.498611,49114600 28 | 2017-09-18,160.110001,160.500000,158.000000,158.669998,156.306625,28269400 29 | 2017-09-19,159.509995,159.770004,158.440002,158.729996,156.365723,20810600 30 | 2017-09-20,157.899994,158.259995,153.830002,156.070007,153.745377,52951400 31 | 2017-09-21,155.800003,155.800003,152.750000,153.389999,151.105270,37511700 32 | 2017-09-22,151.539993,152.270004,150.559998,151.889999,149.627625,46645400 33 | 2017-09-25,149.990005,151.830002,149.160004,150.550003,148.307571,44387300 34 | 2017-09-26,151.779999,153.919998,151.690002,153.139999,150.859009,36660000 35 | 2017-09-27,153.800003,154.720001,153.539993,154.229996,151.932770,25504200 36 | 2017-09-28,153.889999,154.279999,152.699997,153.279999,150.996918,22005500 37 | 2017-09-29,153.210007,154.130005,152.000000,154.119995,151.824387,26299800 38 | 2017-10-02,154.259995,154.449997,152.720001,153.809998,151.519028,18698800 39 | 2017-10-03,154.009995,155.089996,153.910004,154.479996,152.179031,16230300 40 | 2017-10-04,153.630005,153.860001,152.460007,153.479996,151.193924,20163800 41 | 2017-10-05,154.179993,155.440002,154.050003,155.389999,153.075470,21283800 42 | 2017-10-06,154.970001,155.490005,154.559998,155.300003,152.986816,17407600 43 | 2017-10-09,155.809998,156.729996,155.490005,155.839996,153.518768,16262900 44 | 2017-10-10,156.059998,158.000000,155.100006,155.899994,153.577866,15617000 45 | 2017-10-11,155.970001,156.979996,155.750000,156.550003,154.218216,16905600 46 | 2017-10-12,156.350006,157.369995,155.729996,156.000000,153.676392,16125100 47 | 2017-10-13,156.729996,157.279999,156.410004,156.990005,154.651642,16394200 48 | 2017-10-16,157.899994,160.000000,157.649994,159.880005,157.498611,24121500 49 | 2017-10-17,159.779999,160.869995,159.229996,160.470001,158.079819,18997300 50 | 2017-10-18,160.419998,160.710007,159.600006,159.759995,157.380386,16374200 51 | 2017-10-19,156.750000,157.080002,155.020004,155.979996,153.656693,42584200 52 | 2017-10-20,156.610001,157.750000,155.960007,156.250000,153.922668,23974100 53 | 2017-10-23,156.889999,157.690002,155.500000,156.169998,153.843857,21984300 54 | 2017-10-24,156.289993,157.419998,156.199997,157.100006,154.760010,17757200 55 | 2017-10-25,156.910004,157.550003,155.270004,156.410004,154.080307,21207100 56 | 2017-10-26,157.229996,157.830002,156.779999,157.410004,155.065399,17000500 57 | 2017-10-27,159.289993,163.600006,158.699997,163.050003,160.621384,44454200 58 | 2017-10-30,163.889999,168.070007,163.720001,166.720001,164.236725,44700800 59 | 2017-10-31,167.899994,169.649994,166.940002,169.039993,166.522171,36046800 60 | 2017-11-01,169.869995,169.940002,165.610001,166.889999,164.404190,33637800 61 | 2017-11-02,166.600006,168.500000,165.279999,168.110001,165.606018,41393400 62 | 2017-11-03,174.000000,174.259995,171.119995,172.500000,169.930634,59398600 63 | 2017-11-06,172.369995,174.990005,171.720001,174.250000,171.654556,35026300 64 | 2017-11-07,173.910004,175.250000,173.600006,174.809998,172.206223,24361500 65 | 2017-11-08,174.660004,176.240005,174.330002,176.240005,173.614929,24409500 66 | 2017-11-09,175.110001,176.100006,173.139999,175.880005,173.260300,29482600 67 | 2017-11-10,175.110001,175.380005,174.270004,174.669998,172.686859,25145500 68 | 2017-11-13,173.500000,174.500000,173.399994,173.970001,171.994812,16982100 69 | 2017-11-14,173.039993,173.479996,171.179993,171.339996,169.394669,24782500 70 | 2017-11-15,169.970001,170.320007,168.380005,169.080002,167.160339,29158100 71 | 2017-11-16,171.179993,171.869995,170.300003,171.100006,169.157410,23637500 72 | 2017-11-17,171.039993,171.389999,169.639999,170.149994,168.218185,21899500 73 | 2017-11-20,170.289993,170.559998,169.559998,169.979996,168.050110,16262400 74 | 2017-11-21,170.779999,173.699997,170.779999,173.139999,171.174255,25131300 75 | 2017-11-22,173.360001,175.000000,173.050003,174.960007,172.973587,25588900 76 | 2017-11-24,175.100006,175.500000,174.649994,174.970001,172.983475,14026700 77 | 2017-11-27,175.050003,175.080002,173.339996,174.089996,172.113464,20716800 78 | 2017-11-28,174.300003,174.869995,171.860001,173.070007,171.105042,26428800 79 | 2017-11-29,172.630005,172.919998,167.160004,169.479996,167.555801,41666400 80 | 2017-11-30,170.429993,172.139999,168.440002,171.850006,169.898895,41527200 81 | 2017-12-01,169.949997,171.669998,168.500000,171.050003,169.107971,39759300 82 | 2017-12-04,172.479996,172.619995,169.630005,169.800003,167.872177,32542400 83 | 2017-12-05,169.059998,171.520004,168.399994,169.639999,167.713974,27350200 84 | 2017-12-06,167.500000,170.199997,166.460007,169.009995,167.091141,28560000 85 | 2017-12-07,169.029999,170.440002,168.910004,169.320007,167.397629,25673300 86 | 2017-12-08,170.490005,171.000000,168.820007,169.369995,167.447037,23355200 87 | 2017-12-11,169.199997,172.889999,168.789993,172.669998,170.709595,35273800 88 | 2017-12-12,172.149994,172.389999,171.460007,171.699997,169.750595,19409200 89 | 2017-12-13,172.500000,173.539993,172.000000,172.270004,170.314117,23818400 90 | 2017-12-14,172.399994,173.130005,171.649994,172.220001,170.264694,20476500 91 | 2017-12-15,173.630005,174.169998,172.460007,173.970001,171.994812,40169300 92 | 2017-12-18,174.880005,177.199997,174.860001,176.419998,174.417007,29421100 93 | 2017-12-19,175.029999,175.389999,174.089996,174.539993,172.558350,27436400 94 | 2017-12-20,174.869995,175.419998,173.250000,174.350006,172.370514,23475600 95 | 2017-12-21,174.169998,176.020004,174.100006,175.009995,173.023026,20949900 96 | 2017-12-22,174.679993,175.419998,174.500000,175.009995,173.023026,16349400 97 | 2017-12-26,170.800003,171.470001,169.679993,170.570007,168.633423,33185500 98 | 2017-12-27,170.100006,170.779999,169.710007,170.600006,168.663101,21498200 99 | 2017-12-28,171.000000,171.850006,170.479996,171.080002,169.137650,16480200 100 | 2017-12-29,170.520004,170.589996,169.220001,169.229996,167.308640,25999900 101 | 2018-01-02,170.160004,172.300003,169.259995,172.259995,170.304230,25555900 102 | 2018-01-03,172.529999,174.550003,171.960007,172.229996,170.274567,29517900 103 | 2018-01-04,172.539993,173.470001,172.080002,173.029999,171.065506,22434600 104 | 2018-01-05,173.440002,175.369995,173.050003,175.000000,173.013123,23660000 105 | 2018-01-08,174.350006,175.610001,173.929993,174.350006,172.370514,20567800 106 | 2018-01-09,174.550003,175.059998,173.410004,174.330002,172.350739,21584000 107 | 2018-01-10,173.160004,174.300003,173.000000,174.289993,172.311188,23959900 108 | 2018-01-11,174.589996,175.490005,174.490005,175.279999,173.289948,18667700 109 | 2018-01-12,176.179993,177.360001,175.649994,177.089996,175.079391,25418100 110 | 2018-01-16,177.899994,179.389999,176.139999,176.190002,174.189636,29565900 111 | 2018-01-17,176.149994,179.250000,175.070007,179.100006,177.066589,33888500 112 | 2018-01-18,179.369995,180.100006,178.250000,179.259995,177.224762,31193400 113 | 2018-01-19,178.610001,179.580002,177.410004,178.460007,176.433853,32425100 114 | 2018-01-22,177.300003,177.779999,176.600006,177.000000,174.990433,27108600 115 | 2018-01-23,177.300003,179.440002,176.820007,177.039993,175.029968,32689100 116 | 2018-01-24,177.250000,177.300003,173.199997,174.220001,172.241974,51105100 117 | 2018-01-25,174.509995,174.949997,170.529999,171.110001,169.167297,41529000 118 | 2018-01-26,172.000000,172.000000,170.059998,171.509995,169.562744,39143000 119 | 2018-01-29,170.160004,170.160004,167.070007,167.960007,166.053055,50640400 120 | 2018-01-30,165.529999,167.369995,164.699997,166.970001,165.074295,46048200 121 | 2018-01-31,166.869995,168.440002,166.500000,167.429993,165.529068,32478900 122 | 2018-02-01,167.169998,168.619995,166.759995,167.779999,165.875092,47230800 123 | 2018-02-02,166.000000,166.800003,160.100006,160.500000,158.677750,86593800 124 | 2018-02-05,159.100006,163.880005,156.000000,156.490005,154.713287,72738500 125 | 2018-02-06,154.830002,163.720001,154.000000,163.029999,161.179016,68243800 126 | 2018-02-07,163.089996,163.399994,159.070007,159.539993,157.728638,51608600 127 | 2018-02-08,160.289993,161.000000,155.029999,155.149994,153.388489,54390500 128 | 2018-02-09,157.070007,157.889999,150.240005,156.410004,155.264664,70672600 129 | 2018-02-12,158.500000,163.889999,157.509995,162.710007,161.518524,60819500 130 | 2018-02-13,161.949997,164.750000,161.649994,164.339996,163.136581,32549200 131 | 2018-02-14,163.039993,167.539993,162.880005,167.369995,166.144394,40644900 132 | 2018-02-15,169.789993,173.089996,169.000000,172.990005,171.723251,51147200 133 | 2018-02-16,172.360001,174.820007,171.770004,172.429993,171.167343,40176100 134 | 2018-02-20,172.050003,174.259995,171.419998,171.850006,170.591599,33930500 135 | 2018-02-21,172.830002,174.119995,171.009995,171.070007,169.817307,37471600 136 | 2018-02-22,171.800003,173.949997,171.710007,172.500000,171.236832,30991900 137 | 2018-02-23,173.669998,175.649994,173.539993,175.500000,174.214859,33812400 138 | 2018-02-26,176.350006,179.389999,176.210007,178.970001,177.659454,38162200 139 | 2018-02-27,179.100006,180.479996,178.160004,178.389999,177.083710,38928100 140 | 2018-02-28,179.259995,180.619995,178.050003,178.119995,176.815674,37782100 141 | 2018-03-01,178.539993,179.779999,172.660004,175.000000,173.718521,48802000 142 | 2018-03-02,172.800003,176.300003,172.449997,176.210007,174.919678,38454000 143 | 2018-03-05,175.210007,177.740005,174.520004,176.820007,175.525208,28401400 144 | 2018-03-06,177.910004,178.250000,176.130005,176.669998,175.376297,23788500 145 | 2018-03-07,174.940002,175.850006,174.270004,175.029999,173.748306,31703500 146 | 2018-03-08,175.479996,177.119995,175.070007,176.940002,175.644318,23774100 147 | 2018-03-09,177.960007,180.000000,177.389999,179.979996,178.662048,32185200 148 | 2018-03-12,180.289993,182.389999,180.210007,181.720001,180.389313,32207100 149 | 2018-03-13,182.589996,183.500000,179.240005,179.970001,178.652130,31693500 150 | 2018-03-14,180.320007,180.520004,177.809998,178.440002,177.133331,29368400 151 | 2018-03-15,178.500000,180.240005,178.070007,178.649994,177.341782,22743800 152 | 2018-03-16,178.649994,179.119995,177.619995,178.020004,176.716415,39404700 153 | 2018-03-19,177.320007,177.470001,173.660004,175.300003,174.016342,33446800 154 | 2018-03-20,175.240005,176.800003,174.940002,175.240005,173.956772,19649400 155 | 2018-03-21,175.039993,175.089996,171.259995,171.270004,170.015839,37054900 156 | 2018-03-22,170.000000,172.679993,168.600006,168.850006,167.613556,41490800 157 | 2018-03-23,168.389999,169.919998,164.940002,164.940002,163.732193,41028800 158 | 2018-03-26,168.070007,173.100006,166.440002,172.770004,171.504868,37541200 159 | 2018-03-27,173.679993,175.149994,166.919998,168.339996,167.107300,40922600 160 | 2018-03-28,167.250000,170.020004,165.190002,166.479996,165.260910,41668500 161 | 2018-03-29,167.809998,171.750000,166.899994,167.779999,166.551392,38398500 162 | 2018-04-02,166.639999,168.940002,164.470001,166.679993,165.459442,37586800 163 | 2018-04-03,167.639999,168.750000,164.880005,168.389999,167.156921,30278000 164 | 2018-04-04,164.880005,172.009995,164.770004,171.610001,170.353363,34605500 165 | 2018-04-05,172.580002,174.229996,172.080002,172.800003,171.534637,26933200 166 | 2018-04-06,170.970001,172.479996,168.199997,168.380005,167.147018,35005300 167 | 2018-04-09,169.880005,173.089996,169.850006,170.050003,168.804779,29017700 168 | 2018-04-10,173.000000,174.000000,171.529999,173.250000,171.981339,28408600 169 | 2018-04-11,172.229996,173.919998,171.699997,172.440002,171.177277,22431600 170 | 2018-04-12,173.410004,175.000000,173.039993,174.139999,172.864822,22889300 171 | 2018-04-13,174.779999,175.839996,173.850006,174.729996,173.450500,25124300 172 | 2018-04-16,175.029999,176.190002,174.830002,175.820007,174.532532,21578400 173 | 2018-04-17,176.490005,178.940002,176.410004,178.240005,176.934799,26605400 174 | 2018-04-18,177.809998,178.820007,176.880005,177.839996,176.537720,20754500 175 | 2018-04-19,173.759995,175.389999,172.660004,172.800003,171.534637,34808800 176 | 2018-04-20,170.600006,171.220001,165.429993,165.720001,164.506470,65491100 177 | 2018-04-23,166.830002,166.919998,164.089996,165.240005,164.029999,36515500 178 | 2018-04-24,165.669998,166.330002,161.220001,162.940002,161.746841,33692000 179 | 2018-04-25,162.619995,165.419998,162.410004,163.649994,162.451630,28382100 180 | 2018-04-26,164.119995,165.729996,163.369995,164.220001,163.017471,27963000 181 | 2018-04-27,164.000000,164.330002,160.630005,162.320007,161.131378,35655800 182 | 2018-04-30,162.130005,167.259995,161.839996,165.259995,164.049835,42427400 183 | 2018-05-01,166.410004,169.199997,165.270004,169.100006,167.861725,53569400 184 | 2018-05-02,175.229996,177.750000,173.800003,176.570007,175.277039,66539400 185 | 2018-05-03,175.880005,177.500000,174.440002,176.889999,175.594681,34068200 186 | 2018-05-04,178.250000,184.250000,178.169998,183.830002,182.483856,56201300 187 | 2018-05-07,185.179993,187.669998,184.750000,185.160004,183.804123,42451400 188 | 2018-05-08,184.990005,186.220001,183.669998,186.050003,184.687607,28402800 189 | 2018-05-09,186.550003,187.399994,185.220001,187.360001,185.988022,23211200 190 | 2018-05-10,187.740005,190.369995,187.649994,190.039993,188.648392,27989300 191 | 2018-05-11,189.490005,190.059998,187.449997,188.589996,187.930908,26212200 192 | 2018-05-14,189.009995,189.529999,187.860001,188.149994,187.492432,20778800 193 | 2018-05-15,186.779999,187.070007,185.100006,186.440002,185.788422,23695200 194 | 2018-05-16,186.070007,188.460007,186.000000,188.179993,187.522324,19183100 195 | 2018-05-17,188.000000,188.910004,186.360001,186.990005,186.336502,17294000 196 | 2018-05-18,187.190002,187.809998,186.130005,186.309998,185.658875,18297700 197 | 2018-05-21,188.000000,189.270004,186.910004,187.630005,186.974258,18400800 198 | 2018-05-22,188.380005,188.880005,186.779999,187.160004,186.505905,15240700 199 | 2018-05-23,186.350006,188.500000,185.759995,188.360001,187.701706,19467900 200 | 2018-05-24,188.770004,188.839996,186.210007,188.149994,187.492432,20401000 201 | 2018-05-25,188.229996,189.649994,187.649994,188.580002,187.920944,17461000 202 | 2018-05-29,187.600006,188.750000,186.869995,187.899994,187.243317,22369000 203 | 2018-05-30,187.720001,188.000000,186.779999,187.500000,186.844711,18690500 204 | 2018-05-31,187.220001,188.229996,186.139999,186.869995,186.216904,27482800 205 | 2018-06-01,187.990005,190.259995,187.750000,190.240005,189.575150,23250400 206 | 2018-06-04,191.639999,193.419998,191.350006,191.830002,191.159576,26132000 207 | 2018-06-05,193.070007,193.940002,192.360001,193.309998,192.634399,21566000 208 | 2018-06-06,193.630005,194.080002,191.919998,193.979996,193.302063,20933600 209 | 2018-06-07,194.139999,194.199997,192.339996,193.460007,192.783890,21347200 210 | 2018-06-08,191.169998,192.000000,189.770004,191.699997,191.030029,26656800 211 | 2018-06-11,191.350006,191.970001,190.210007,191.229996,190.561676,18308500 212 | 2018-06-12,191.389999,192.610001,191.149994,192.279999,191.608002,16911100 213 | 2018-06-13,192.419998,192.880005,190.440002,190.699997,190.033524,21638400 214 | 2018-06-14,191.550003,191.570007,190.220001,190.800003,190.133179,21610100 215 | 2018-06-15,190.029999,190.160004,188.259995,188.839996,188.180023,61719200 216 | 2018-06-18,187.880005,189.220001,187.199997,188.740005,188.080383,18484900 217 | 2018-06-19,185.139999,186.330002,183.449997,185.690002,185.041046,33578500 218 | 2018-06-20,186.350006,187.199997,185.729996,186.500000,185.848206,20628700 219 | 2018-06-21,187.250000,188.350006,184.940002,185.460007,184.811844,25711900 220 | 2018-06-22,186.119995,186.149994,184.699997,184.919998,184.273727,27200400 221 | 2018-06-25,183.399994,184.919998,180.729996,182.169998,181.533340,31663100 222 | 2018-06-26,182.990005,186.529999,182.539993,184.429993,183.785431,24569200 223 | 2018-06-27,185.229996,187.279999,184.029999,184.160004,183.516388,25285300 224 | 2018-06-28,184.100006,186.210007,183.800003,185.500000,184.851700,17365200 225 | 2018-06-29,186.289993,187.190002,182.910004,185.110001,184.463074,22737700 226 | 2018-07-02,183.820007,187.300003,183.419998,187.179993,186.525818,17731300 227 | 2018-07-03,187.789993,187.949997,183.539993,183.919998,183.277222,13954800 228 | 2018-07-05,185.259995,186.410004,184.279999,185.399994,184.752045,16604200 229 | 2018-07-06,185.419998,188.429993,185.199997,187.970001,187.313080,17485200 230 | 2018-07-09,189.500000,190.679993,189.300003,190.580002,189.913956,19756600 231 | 2018-07-10,190.710007,191.279999,190.179993,190.350006,189.684753,15939100 232 | 2018-07-11,188.500000,189.779999,187.610001,187.880005,187.223389,18831500 233 | 2018-07-12,189.529999,191.410004,189.309998,191.029999,190.362381,18041100 234 | 2018-07-13,191.080002,191.839996,190.899994,191.330002,190.661331,12513900 235 | 2018-07-16,191.520004,192.649994,190.419998,190.910004,190.242798,15043100 236 | 2018-07-17,189.750000,191.869995,189.199997,191.449997,190.780899,15534500 237 | 2018-07-18,191.779999,191.800003,189.929993,190.399994,189.734573,16393400 238 | 2018-07-19,189.690002,192.550003,189.690002,191.880005,191.209412,20286800 239 | 2018-07-20,191.779999,192.429993,190.169998,191.440002,190.770950,20676200 240 | 2018-07-23,190.679993,191.960007,189.559998,191.610001,190.940353,15989400 241 | 2018-07-24,192.449997,193.660004,192.050003,193.000000,192.325485,18697900 242 | 2018-07-25,193.059998,194.850006,192.429993,194.820007,194.139145,16709900 243 | 2018-07-26,194.610001,195.960007,193.610001,194.210007,193.531265,19076000 244 | 2018-07-27,194.990005,195.190002,190.100006,190.979996,190.312546,24024000 245 | 2018-07-30,191.899994,192.199997,189.070007,189.910004,189.246292,21029500 246 | 2018-07-31,190.300003,192.139999,189.339996,190.289993,189.624954,39373000 247 | 2018-08-01,199.130005,201.759995,197.309998,201.500000,200.795792,67935700 248 | 2018-08-02,200.580002,208.380005,200.350006,207.389999,206.665207,62404000 249 | 2018-08-03,207.029999,208.740005,205.479996,207.990005,207.263107,33447400 250 | 2018-08-06,208.000000,209.250000,207.070007,209.070007,208.339340,25425400 251 | 2018-08-07,209.320007,209.500000,206.759995,207.110001,206.386185,25587400 252 | 2018-08-08,206.050003,207.809998,204.520004,207.250000,206.525696,22525500 253 | 2018-08-09,207.279999,209.779999,207.199997,208.880005,208.149994,23469200 254 | 2018-08-10,207.360001,209.100006,206.669998,207.529999,207.529999,24600100 -------------------------------------------------------------------------------- /data/AMZN_2018.csv: -------------------------------------------------------------------------------- 1 | timestamp,open,high,low,close,adjusted_close,volume,dividend_amount,split_coefficient 2 | 2018-12-31,1510.8000,1520.7600,1487.0000,1501.9700,1501.9700,6954507,0.0000,1.0000 3 | 2018-12-28,1473.3500,1513.4700,1449.0000,1478.0200,1478.0200,8828950,0.0000,1.0000 4 | 2018-12-27,1454.2000,1469.0000,1390.3100,1461.6400,1461.6400,9722034,0.0000,1.0000 5 | 2018-12-26,1368.8900,1473.1600,1363.0100,1470.9000,1470.9000,10411801,0.0000,1.0000 6 | 2018-12-24,1346.0000,1396.0300,1307.0000,1343.9600,1343.9600,7219996,0.0000,1.0000 7 | 2018-12-21,1464.9900,1480.0000,1363.9600,1377.4500,1377.4500,13640320,0.0000,1.0000 8 | 2018-12-20,1484.0000,1509.5000,1432.6900,1460.8300,1460.8300,9991833,0.0000,1.0000 9 | 2018-12-19,1543.0500,1584.5300,1483.1800,1495.0800,1495.0800,8792189,0.0000,1.0000 10 | 2018-12-18,1540.0000,1567.5500,1523.0100,1551.4800,1551.4800,6522975,0.0000,1.0000 11 | 2018-12-17,1566.0000,1576.1300,1505.0100,1520.9100,1520.9100,8829762,0.0000,1.0000 12 | 2018-12-14,1638.0000,1642.5700,1585.0000,1591.9100,1591.9100,6367163,0.0000,1.0000 13 | 2018-12-13,1680.0000,1692.1200,1641.5000,1658.3800,1658.3800,5271162,0.0000,1.0000 14 | 2018-12-12,1669.0000,1704.9900,1660.2700,1663.5400,1663.5400,6597968,0.0000,1.0000 15 | 2018-12-11,1678.0000,1679.4700,1619.6000,1643.2400,1643.2400,6244695,0.0000,1.0000 16 | 2018-12-10,1623.8400,1657.9900,1590.8700,1641.0300,1641.0300,7494808,0.0000,1.0000 17 | 2018-12-07,1705.0700,1718.9300,1625.4600,1629.1300,1629.1300,7576132,0.0000,1.0000 18 | 2018-12-06,1614.8700,1701.0500,1609.8500,1699.1900,1699.1900,8789394,0.0000,1.0000 19 | 2018-12-04,1756.0000,1770.3400,1665.0000,1668.4000,1668.4000,8694455,0.0000,1.0000 20 | 2018-12-03,1769.4600,1778.3400,1730.0000,1772.3600,1772.3600,6862160,0.0000,1.0000 21 | 2018-11-30,1679.5000,1696.0000,1666.5000,1690.1700,1690.1700,5761761,0.0000,1.0000 22 | 2018-11-29,1674.9900,1689.9900,1652.3300,1673.5700,1673.5700,6613243,0.0000,1.0000 23 | 2018-11-28,1613.9200,1681.4500,1601.2100,1677.7500,1677.7500,8458738,0.0000,1.0000 24 | 2018-11-27,1575.9900,1597.6500,1558.0100,1581.4200,1581.4200,5783227,0.0000,1.0000 25 | 2018-11-26,1539.0000,1584.8100,1524.2200,1581.3300,1581.3300,6257716,0.0000,1.0000 26 | 2018-11-23,1517.0000,1536.2000,1501.8100,1502.0600,1502.0600,2707642,0.0000,1.0000 27 | 2018-11-21,1542.9900,1550.0000,1515.0000,1516.7300,1516.7300,5716800,0.0000,1.0000 28 | 2018-11-20,1437.5000,1534.7500,1420.0000,1495.4600,1495.4600,10878823,0.0000,1.0000 29 | 2018-11-19,1577.0100,1581.1900,1503.3600,1512.2900,1512.2900,7789981,0.0000,1.0000 30 | 2018-11-16,1587.5000,1614.4800,1573.1200,1593.4100,1593.4100,6066080,0.0000,1.0000 31 | 2018-11-15,1581.0100,1624.8200,1546.5100,1619.4400,1619.4400,8427337,0.0000,1.0000 32 | 2018-11-14,1656.3200,1673.0000,1597.0700,1599.0100,1599.0100,6486891,0.0000,1.0000 33 | 2018-11-13,1649.2900,1677.0600,1613.7500,1631.1700,1631.1700,5933271,0.0000,1.0000 34 | 2018-11-12,1698.2400,1708.5500,1630.0100,1636.8500,1636.8500,6806245,0.0000,1.0000 35 | 2018-11-09,1732.5000,1743.9200,1701.8700,1712.4300,1712.4300,5902186,0.0000,1.0000 36 | 2018-11-08,1755.0000,1784.0000,1725.1100,1754.9100,1754.9100,6534866,0.0000,1.0000 37 | 2018-11-07,1673.0000,1759.2300,1664.0800,1755.4900,1755.4900,8192234,0.0000,1.0000 38 | 2018-11-06,1618.3500,1665.0000,1614.5500,1642.8100,1642.8100,4257353,0.0000,1.0000 39 | 2018-11-05,1657.5700,1658.0900,1596.3600,1627.8000,1627.8000,5624727,0.0000,1.0000 40 | 2018-11-02,1678.5900,1697.4400,1651.8300,1665.5300,1665.5300,6955548,0.0000,1.0000 41 | 2018-11-01,1623.5300,1670.4500,1598.4400,1665.5300,1665.5300,8135539,0.0000,1.0000 42 | 2018-10-31,1569.9900,1623.9100,1565.0900,1598.0100,1598.0100,9390211,0.0000,1.0000 43 | 2018-10-30,1486.1600,1540.9900,1476.3600,1530.4200,1530.4200,12460086,0.0000,1.0000 44 | 2018-10-29,1660.0000,1665.7400,1495.0000,1538.8800,1538.8800,13866077,0.0000,1.0000 45 | 2018-10-26,1649.5900,1698.4600,1603.0000,1642.8100,1642.8100,14963783,0.0000,1.0000 46 | 2018-10-25,1703.3400,1794.8100,1692.0100,1782.1700,1782.1700,10285742,0.0000,1.0000 47 | 2018-10-24,1773.7000,1777.7100,1656.5600,1664.2000,1664.2000,6928383,0.0000,1.0000 48 | 2018-10-23,1742.2400,1776.3400,1714.0000,1768.7000,1768.7000,6723913,0.0000,1.0000 49 | 2018-10-22,1784.0000,1809.5000,1756.0000,1789.3000,1789.3000,4500015,0.0000,1.0000 50 | 2018-10-19,1785.1600,1809.1000,1753.0000,1764.0300,1764.0300,5907246,0.0000,1.0000 51 | 2018-10-18,1821.4900,1830.1500,1767.8700,1770.7200,1770.7200,5873995,0.0000,1.0000 52 | 2018-10-17,1842.7900,1845.0000,1807.0000,1831.7300,1831.7300,5295177,0.0000,1.0000 53 | 2018-10-16,1783.5000,1823.8800,1761.5500,1819.9600,1819.9600,5859918,0.0000,1.0000 54 | 2018-10-15,1795.0000,1795.0500,1734.2300,1760.9500,1760.9500,6437162,0.0000,1.0000 55 | 2018-10-12,1808.0000,1808.9500,1742.5300,1788.6100,1788.6100,9444587,0.0000,1.0000 56 | 2018-10-11,1724.0000,1755.4000,1685.1000,1719.3600,1719.3600,13935872,0.0000,1.0000 57 | 2018-10-10,1857.8900,1858.5600,1754.4100,1755.2500,1755.2500,10988855,0.0000,1.0000 58 | 2018-10-09,1859.9900,1896.6800,1852.3200,1870.3200,1870.3200,4772866,0.0000,1.0000 59 | 2018-10-08,1874.0000,1902.0000,1830.6600,1864.4200,1864.4200,7393199,0.0000,1.0000 60 | 2018-10-05,1917.9900,1929.0800,1862.8300,1889.6500,1889.6500,6822327,0.0000,1.0000 61 | 2018-10-04,1949.0000,1956.0000,1896.5700,1909.4200,1909.4200,7256973,0.0000,1.0000 62 | 2018-10-03,1981.7000,1989.7000,1949.8100,1952.7600,1952.7600,5253131,0.0000,1.0000 63 | 2018-10-02,1999.9900,2013.3900,1965.7700,1971.3100,1971.3100,5400749,0.0000,1.0000 64 | 2018-10-01,2021.9900,2033.1900,2003.6000,2004.3600,2004.3600,3468285,0.0000,1.0000 65 | 2018-09-28,2004.4100,2026.5200,1996.4600,2003.0000,2003.0000,4085135,0.0000,1.0000 66 | 2018-09-27,1993.2400,2016.1600,1988.5800,2012.9800,2012.9800,4329391,0.0000,1.0000 67 | 2018-09-26,1968.5000,1995.2500,1961.5200,1974.8500,1974.8500,4313459,0.0000,1.0000 68 | 2018-09-25,1942.9000,1975.9100,1938.8500,1974.5500,1974.5500,4538407,0.0000,1.0000 69 | 2018-09-24,1903.7900,1936.8800,1865.0000,1934.3600,1934.3600,4213728,0.0000,1.0000 70 | 2018-09-21,1954.2200,1957.3100,1910.5000,1915.0100,1915.0100,6855898,0.0000,1.0000 71 | 2018-09-20,1938.5800,1955.0000,1932.2500,1944.3000,1944.3000,3154934,0.0000,1.0000 72 | 2018-09-19,1940.5000,1940.8300,1904.9000,1926.4200,1926.4200,4056822,0.0000,1.0000 73 | 2018-09-18,1918.6500,1958.2000,1915.4400,1941.0500,1941.0500,4268706,0.0000,1.0000 74 | 2018-09-17,1954.7300,1956.8200,1887.4100,1908.0300,1908.0300,7050192,0.0000,1.0000 75 | 2018-09-14,1992.9300,1993.6500,1959.2200,1970.1900,1970.1900,3642030,0.0000,1.0000 76 | 2018-09-13,2000.0000,2008.7600,1982.0300,1989.8700,1989.8700,3621511,0.0000,1.0000 77 | 2018-09-12,1994.0000,2000.0000,1962.4400,1990.0000,1990.0000,4414012,0.0000,1.0000 78 | 2018-09-11,1928.2700,1988.8800,1917.0000,1987.1500,1987.1500,5033645,0.0000,1.0000 79 | 2018-09-10,1971.0000,1973.0400,1931.5200,1939.0100,1939.0100,4544831,0.0000,1.0000 80 | 2018-09-07,1938.7100,1975.2000,1937.3500,1952.0700,1952.0700,4892643,0.0000,1.0000 81 | 2018-09-06,2006.5100,2007.5000,1935.2100,1958.3100,1958.3100,7488680,0.0000,1.0000 82 | 2018-09-05,2038.1100,2040.3800,1989.8900,1994.8200,1994.8200,8220576,0.0000,1.0000 83 | 2018-09-04,2026.5000,2050.5000,2013.0000,2039.5100,2039.5100,5721093,0.0000,1.0000 84 | 2018-08-31,2007.0000,2022.3800,2004.7400,2012.7100,2012.7100,4204378,0.0000,1.0000 85 | 2018-08-30,1997.4200,2025.5700,1986.9000,2002.3800,2002.3800,7277257,0.0000,1.0000 86 | 2018-08-29,1953.4500,1998.6900,1948.9400,1998.1000,1998.1000,6531761,0.0000,1.0000 87 | 2018-08-28,1937.7300,1941.7800,1928.8200,1932.8200,1932.8200,3100727,0.0000,1.0000 88 | 2018-08-27,1915.0000,1927.7000,1909.2800,1927.6800,1927.6800,3569037,0.0000,1.0000 89 | 2018-08-24,1910.5100,1916.0100,1902.5400,1905.3900,1905.3900,2800863,0.0000,1.0000 90 | 2018-08-23,1907.1700,1919.5000,1900.7600,1902.9000,1902.9000,3562997,0.0000,1.0000 91 | 2018-08-22,1876.6400,1905.8000,1876.6400,1904.9000,1904.9000,3080464,0.0000,1.0000 92 | 2018-08-21,1880.0000,1897.7500,1874.4000,1883.4200,1883.4200,3105626,0.0000,1.0000 93 | 2018-08-20,1890.5700,1891.7500,1866.0600,1876.7100,1876.7100,2862016,0.0000,1.0000 94 | 2018-08-17,1885.8000,1888.0000,1855.5500,1882.2200,1882.2200,4104300,0.0000,1.0000 95 | 2018-08-16,1903.9400,1905.0000,1883.5500,1886.5200,1886.5200,3957090,0.0000,1.0000 96 | 2018-08-15,1909.5500,1916.2100,1869.7900,1882.6200,1882.6200,7700682,0.0000,1.0000 97 | 2018-08-14,1919.3900,1921.0100,1900.0000,1919.6500,1919.6500,3986123,0.0000,1.0000 98 | 2018-08-13,1898.5000,1925.0000,1893.6700,1896.2000,1896.2000,5531475,0.0000,1.0000 99 | 2018-08-10,1888.5100,1899.5000,1878.2100,1886.3000,1886.3000,3639927,0.0000,1.0000 100 | 2018-08-09,1882.0000,1914.5700,1877.4800,1898.5200,1898.5200,4860374,0.0000,1.0000 101 | 2018-08-08,1861.0000,1891.5100,1854.5000,1886.5200,1886.5200,3963017,0.0000,1.0000 102 | 2018-08-07,1854.5300,1869.7200,1846.2700,1862.4800,1862.4800,3377473,0.0000,1.0000 103 | 2018-08-06,1825.8100,1847.7700,1818.9200,1847.7500,1847.7500,3391825,0.0000,1.0000 104 | 2018-08-03,1837.7400,1841.0000,1821.5000,1823.2900,1823.2900,3460487,0.0000,1.0000 105 | 2018-08-02,1788.7700,1836.5600,1786.0000,1834.3300,1834.3300,4354681,0.0000,1.0000 106 | 2018-08-01,1784.0000,1798.4400,1776.0200,1797.1700,1797.1700,4153096,0.0000,1.0000 107 | 2018-07-31,1786.4900,1801.8300,1739.3200,1777.4400,1777.4400,5738713,0.0000,1.0000 108 | 2018-07-30,1827.3300,1829.5000,1766.0200,1779.2200,1779.2200,6562321,0.0000,1.0000 109 | 2018-07-27,1876.0500,1880.0500,1806.5300,1817.2700,1817.2700,9680959,0.0000,1.0000 110 | 2018-07-26,1839.0000,1844.6800,1804.5000,1808.0000,1808.0000,9924371,0.0000,1.0000 111 | 2018-07-25,1829.3000,1863.8400,1822.6400,1863.6100,1863.6100,3836333,0.0000,1.0000 112 | 2018-07-24,1829.0100,1840.0000,1809.3800,1829.2400,1829.2400,4278723,0.0000,1.0000 113 | 2018-07-23,1812.2100,1819.0000,1769.9900,1802.0000,1802.0000,3888462,0.0000,1.0000 114 | 2018-07-20,1825.0100,1834.8400,1810.0600,1813.7000,1813.7000,3891566,0.0000,1.0000 115 | 2018-07-19,1829.4600,1841.0000,1811.2700,1812.9700,1812.9700,4676942,0.0000,1.0000 116 | 2018-07-18,1848.0000,1858.8800,1831.2700,1842.9200,1842.9200,4861913,0.0000,1.0000 117 | 2018-07-17,1811.5600,1851.6900,1797.3800,1843.9300,1843.9300,5682881,0.0000,1.0000 118 | 2018-07-16,1821.9500,1841.9500,1814.4500,1822.4900,1822.4900,5466195,0.0000,1.0000 119 | 2018-07-13,1803.9300,1815.3000,1795.2200,1813.0300,1813.0300,4386679,0.0000,1.0000 120 | 2018-07-12,1764.5100,1798.0000,1762.1800,1796.6200,1796.6200,4532743,0.0000,1.0000 121 | 2018-07-11,1737.9900,1756.9600,1734.0000,1755.0000,1755.0000,3209782,0.0000,1.0000 122 | 2018-07-10,1738.5300,1750.0000,1731.0000,1743.0700,1743.0700,3002905,0.0000,1.0000 123 | 2018-07-09,1724.0500,1739.5600,1716.2300,1739.0200,1739.0200,3011988,0.0000,1.0000 124 | 2018-07-06,1696.0000,1715.2700,1691.6700,1710.6300,1710.6300,2650262,0.0000,1.0000 125 | 2018-07-05,1705.3800,1710.6900,1682.1500,1699.7300,1699.7300,2983110,0.0000,1.0000 126 | 2018-07-03,1723.9600,1725.0000,1692.4800,1693.9600,1693.9600,2177276,0.0000,1.0000 127 | 2018-07-02,1682.7000,1713.8900,1678.0600,1713.7800,1713.7800,3185696,0.0000,1.0000 128 | 2018-06-29,1717.0000,1723.4100,1694.3200,1699.8000,1699.8000,4543508,0.0000,1.0000 129 | 2018-06-28,1672.5400,1705.5000,1661.1700,1701.4500,1701.4500,4529700,0.0000,1.0000 130 | 2018-06-27,1708.1100,1711.9500,1660.0000,1660.5100,1660.5100,4872201,0.0000,1.0000 131 | 2018-06-26,1672.3700,1701.5700,1663.3400,1691.0900,1691.0900,4386585,0.0000,1.0000 132 | 2018-06-25,1702.5100,1705.0000,1646.3100,1663.1500,1663.1500,7511196,0.0000,1.0000 133 | 2018-06-22,1742.6200,1743.0000,1711.9000,1715.6700,1715.6700,4075124,0.0000,1.0000 134 | 2018-06-21,1760.0000,1763.1000,1717.5600,1730.2200,1730.2200,4941148,0.0000,1.0000 135 | 2018-06-20,1742.5000,1762.9300,1741.3600,1750.0800,1750.0800,4332591,0.0000,1.0000 136 | 2018-06-19,1709.0400,1736.1100,1700.3900,1734.7800,1734.7800,4290117,0.0000,1.0000 137 | 2018-06-18,1706.2600,1726.7400,1702.5600,1723.7900,1723.7900,3107742,0.0000,1.0000 138 | 2018-06-15,1714.0000,1720.8700,1708.5200,1715.9700,1715.9700,4777646,0.0000,1.0000 139 | 2018-06-14,1713.4800,1724.8000,1708.8700,1723.8600,1723.8600,3174415,0.0000,1.0000 140 | 2018-06-13,1702.8100,1713.7500,1700.1200,1704.8600,1704.8600,3327529,0.0000,1.0000 141 | 2018-06-12,1693.0000,1699.5100,1691.5200,1698.7500,1698.7500,2259215,0.0000,1.0000 142 | 2018-06-11,1681.5100,1694.2400,1680.5900,1689.1200,1689.1200,2335484,0.0000,1.0000 143 | 2018-06-08,1681.1200,1689.4400,1673.0100,1683.9900,1683.9900,2955110,0.0000,1.0000 144 | 2018-06-07,1698.5600,1699.9000,1676.1100,1689.3000,1689.3000,3765687,0.0000,1.0000 145 | 2018-06-06,1704.5100,1714.5000,1686.4700,1695.7500,1695.7500,5473213,0.0000,1.0000 146 | 2018-06-05,1672.9900,1699.0000,1670.0600,1696.3500,1696.3500,4782177,0.0000,1.0000 147 | 2018-06-04,1648.9000,1665.6800,1645.4900,1665.2700,1665.2700,3187737,0.0000,1.0000 148 | 2018-06-01,1637.0300,1646.7300,1635.0900,1641.5400,1641.5400,3313385,0.0000,1.0000 149 | 2018-05-31,1623.0000,1635.0000,1621.3500,1629.6200,1629.6200,3166330,0.0000,1.0000 150 | 2018-05-30,1618.1000,1626.0000,1612.9300,1624.8900,1624.8900,2907357,0.0000,1.0000 151 | 2018-05-29,1600.7100,1621.7900,1600.1500,1612.8700,1612.8700,3846477,0.0000,1.0000 152 | 2018-05-25,1603.0000,1614.1200,1600.4500,1610.1500,1610.1500,2698400,0.0000,1.0000 153 | 2018-05-24,1598.0300,1608.2400,1588.3800,1603.0700,1603.0700,3429975,0.0000,1.0000 154 | 2018-05-23,1571.0500,1601.8600,1566.3400,1601.8600,1601.8600,3361892,0.0000,1.0000 155 | 2018-05-22,1589.8900,1589.8900,1575.2500,1581.4000,1581.4000,2115639,0.0000,1.0000 156 | 2018-05-21,1585.0000,1592.0500,1575.0000,1585.4600,1585.4600,2925235,0.0000,1.0000 157 | 2018-05-18,1581.3300,1583.5900,1572.1000,1574.3700,1574.3700,2642584,0.0000,1.0000 158 | 2018-05-17,1580.5600,1594.0400,1573.0000,1581.7600,1581.7600,2147606,0.0000,1.0000 159 | 2018-05-16,1577.5000,1594.4300,1576.6700,1587.2800,1587.2800,2570572,0.0000,1.0000 160 | 2018-05-15,1587.8000,1587.8000,1565.2200,1576.1200,1576.1200,5077465,0.0000,1.0000 161 | 2018-05-14,1604.0000,1611.1800,1600.0500,1601.5400,1601.5400,2509483,0.0000,1.0000 162 | 2018-05-11,1610.9900,1611.1000,1597.8900,1602.9100,1602.9100,2263900,0.0000,1.0000 163 | 2018-05-10,1608.4800,1615.6000,1603.4400,1609.0800,1609.0800,2817450,0.0000,1.0000 164 | 2018-05-09,1600.0000,1608.0000,1592.0000,1608.0000,1608.0000,3637302,0.0000,1.0000 165 | 2018-05-08,1595.0000,1596.8800,1582.5100,1592.3900,1592.3900,3067949,0.0000,1.0000 166 | 2018-05-07,1589.3400,1606.9500,1587.8300,1600.1400,1600.1400,3801855,0.0000,1.0000 167 | 2018-05-04,1562.4500,1584.9000,1562.1900,1580.9500,1580.9500,3443567,0.0000,1.0000 168 | 2018-05-03,1560.0100,1574.8000,1546.0200,1572.0800,1572.0800,4251917,0.0000,1.0000 169 | 2018-05-02,1580.9800,1588.5000,1566.3600,1569.6800,1569.6800,4360273,0.0000,1.0000 170 | 2018-05-01,1563.2200,1585.0000,1552.1800,1582.2600,1582.2600,4572071,0.0000,1.0000 171 | 2018-04-30,1582.5000,1596.0000,1560.9400,1566.1300,1566.1300,5464085,0.0000,1.0000 172 | 2018-04-27,1634.0100,1638.1000,1567.3900,1572.6200,1572.6200,13053241,0.0000,1.0000 173 | 2018-04-26,1485.0100,1529.4200,1478.5000,1517.9600,1517.9600,8801101,0.0000,1.0000 174 | 2018-04-25,1458.0000,1469.9900,1415.0200,1460.1700,1460.1700,6587290,0.0000,1.0000 175 | 2018-04-24,1535.8000,1539.5000,1448.4500,1460.0900,1460.0900,7494699,0.0000,1.0000 176 | 2018-04-23,1546.6900,1548.0000,1503.4100,1517.8600,1517.8600,4465424,0.0000,1.0000 177 | 2018-04-20,1561.2000,1561.2000,1516.0900,1527.4900,1527.4900,5541622,0.0000,1.0000 178 | 2018-04-19,1543.2200,1568.5200,1539.0600,1556.9100,1556.9100,6523728,0.0000,1.0000 179 | 2018-04-18,1514.6500,1533.8000,1504.1100,1527.8400,1527.8400,5227509,0.0000,1.0000 180 | 2018-04-17,1462.3000,1507.1900,1457.0200,1503.8300,1503.8300,5114403,0.0000,1.0000 181 | 2018-04-16,1445.0000,1447.0000,1427.4800,1441.5000,1441.5000,2808624,0.0000,1.0000 182 | 2018-04-13,1449.1400,1459.7800,1424.5200,1430.7900,1430.7900,3685267,0.0000,1.0000 183 | 2018-04-12,1439.5000,1452.1200,1435.0600,1448.5000,1448.5000,3135027,0.0000,1.0000 184 | 2018-04-11,1439.4400,1448.7800,1424.8900,1427.0500,1427.0500,3582533,0.0000,1.0000 185 | 2018-04-10,1431.9900,1438.3800,1415.7000,1436.2200,1436.2200,4280144,0.0000,1.0000 186 | 2018-04-09,1425.0300,1438.4800,1402.5700,1406.0800,1406.0800,4208206,0.0000,1.0000 187 | 2018-04-06,1429.9700,1452.5000,1400.2600,1405.2300,1405.2300,5882257,0.0000,1.0000 188 | 2018-04-05,1441.9900,1459.5600,1427.0700,1451.7500,1451.7500,6413459,0.0000,1.0000 189 | 2018-04-04,1358.2400,1415.3900,1352.8800,1410.5700,1410.5700,6982305,0.0000,1.0000 190 | 2018-04-03,1391.3800,1414.0000,1355.3300,1392.0500,1392.0500,10231212,0.0000,1.0000 191 | 2018-04-02,1417.6200,1421.3600,1355.0000,1371.9900,1371.9900,10463607,0.0000,1.0000 192 | 2018-03-29,1406.0000,1455.4700,1365.2000,1447.3400,1447.3400,12581121,0.0000,1.0000 193 | 2018-03-28,1447.0000,1455.9000,1386.1700,1431.4200,1431.4200,13705317,0.0000,1.0000 194 | 2018-03-27,1572.4000,1575.9600,1482.3200,1497.0500,1497.0500,6793279,0.0000,1.0000 195 | 2018-03-26,1530.0000,1556.9900,1499.2500,1555.8600,1555.8600,5547618,0.0000,1.0000 196 | 2018-03-23,1539.0100,1549.0200,1495.3600,1495.5600,1495.5600,7843966,0.0000,1.0000 197 | 2018-03-22,1565.4700,1573.8500,1542.4000,1544.9200,1544.9200,6177737,0.0000,1.0000 198 | 2018-03-21,1586.4500,1590.0000,1563.1700,1581.8600,1581.8600,4667291,0.0000,1.0000 199 | 2018-03-20,1550.3400,1587.0000,1545.4100,1586.5100,1586.5100,4507049,0.0000,1.0000 200 | 2018-03-19,1554.5300,1561.6600,1525.3500,1544.9300,1544.9300,6376619,0.0000,1.0000 201 | 2018-03-16,1583.4500,1589.4400,1567.5000,1571.6800,1571.6800,5145054,0.0000,1.0000 202 | 2018-03-15,1595.0000,1596.9100,1578.1100,1582.3200,1582.3200,4026744,0.0000,1.0000 203 | 2018-03-14,1597.0000,1606.4400,1590.8900,1591.0000,1591.0000,4164395,0.0000,1.0000 204 | 2018-03-13,1615.9600,1617.5400,1578.0100,1588.1800,1588.1800,6427066,0.0000,1.0000 205 | 2018-03-12,1592.6000,1605.3300,1586.7000,1598.3900,1598.3900,5115886,0.0000,1.0000 206 | 2018-03-09,1563.5000,1578.9400,1559.0800,1578.8900,1578.8900,4417059,0.0000,1.0000 207 | 2018-03-08,1550.0000,1554.8800,1545.2500,1551.8600,1551.8600,3512528,0.0000,1.0000 208 | 2018-03-07,1526.5200,1545.9000,1522.5100,1545.0000,1545.0000,4174123,0.0000,1.0000 209 | 2018-03-06,1533.2000,1542.1300,1528.0000,1537.6400,1537.6400,4561718,0.0000,1.0000 210 | 2018-03-05,1494.2400,1525.3800,1481.0000,1523.6100,1523.6100,5233934,0.0000,1.0000 211 | 2018-03-02,1469.1000,1501.0500,1455.0100,1500.2500,1500.2500,6587564,0.0000,1.0000 212 | 2018-03-01,1513.6000,1518.4900,1465.0000,1493.4500,1493.4500,6835230,0.0000,1.0000 213 | 2018-02-28,1519.5100,1528.7000,1512.0000,1512.4500,1512.4500,4426580,0.0000,1.0000 214 | 2018-02-27,1524.5000,1526.7800,1507.2100,1511.9800,1511.9800,4708378,0.0000,1.0000 215 | 2018-02-26,1509.2000,1522.8400,1507.0000,1521.9500,1521.9500,4909053,0.0000,1.0000 216 | 2018-02-23,1495.3400,1500.0000,1486.5000,1500.0000,1500.0000,4327008,0.0000,1.0000 217 | 2018-02-22,1495.3600,1502.5400,1475.7600,1485.3400,1485.3400,4732555,0.0000,1.0000 218 | 2018-02-21,1485.0000,1503.4900,1478.9200,1482.9200,1482.9200,6216694,0.0000,1.0000 219 | 2018-02-20,1446.4900,1488.7700,1446.4900,1468.3500,1468.3500,6388374,0.0000,1.0000 220 | 2018-02-16,1457.3700,1465.8000,1446.5600,1448.6900,1448.6900,4410879,0.0000,1.0000 221 | 2018-02-15,1466.8900,1468.9400,1436.8400,1461.7600,1461.7600,5598111,0.0000,1.0000 222 | 2018-02-14,1406.2500,1452.0600,1403.3600,1451.0500,1451.0500,5881238,0.0000,1.0000 223 | 2018-02-13,1385.9300,1419.7200,1383.5300,1414.5100,1414.5100,5858860,0.0000,1.0000 224 | 2018-02-12,1364.6700,1393.8100,1344.0100,1386.2300,1386.2300,6682214,0.0000,1.0000 225 | 2018-02-09,1373.4900,1383.5000,1265.9300,1339.6000,1339.6000,13787886,0.0000,1.0000 226 | 2018-02-08,1429.6700,1433.7500,1349.9400,1350.5000,1350.5000,8108560,0.0000,1.0000 227 | 2018-02-07,1449.0000,1460.9900,1415.1500,1416.7800,1416.7800,7066828,0.0000,1.0000 228 | 2018-02-06,1361.4600,1443.9900,1351.7900,1442.8400,1442.8400,10773963,0.0000,1.0000 229 | 2018-02-05,1402.6200,1458.9800,1320.7200,1390.0000,1390.0000,10756332,0.0000,1.0000 230 | 2018-02-02,1477.3900,1498.0000,1414.0000,1429.9500,1429.9500,10915962,0.0000,1.0000 231 | 2018-02-01,1445.0000,1459.8800,1385.1400,1390.0000,1390.0000,7812953,0.0000,1.0000 232 | 2018-01-31,1451.3000,1472.5800,1450.0400,1450.8900,1450.8900,6220396,0.0000,1.0000 233 | 2018-01-30,1403.1700,1439.2500,1392.0000,1437.8200,1437.8200,5736512,0.0000,1.0000 234 | 2018-01-29,1409.1800,1431.3900,1400.4400,1417.6800,1417.6800,5628992,0.0000,1.0000 235 | 2018-01-26,1392.0100,1402.5300,1380.9100,1402.0500,1402.0500,4584082,0.0000,1.0000 236 | 2018-01-25,1368.0000,1378.3400,1357.6200,1377.9500,1377.9500,4621862,0.0000,1.0000 237 | 2018-01-24,1374.8200,1388.1600,1338.0000,1357.5100,1357.5100,6730084,0.0000,1.0000 238 | 2018-01-23,1338.0900,1364.9000,1337.3400,1362.5400,1362.5400,5056764,0.0000,1.0000 239 | 2018-01-22,1297.1700,1327.4500,1296.6600,1327.3100,1327.3100,3970151,0.0000,1.0000 240 | 2018-01-19,1312.0000,1313.0000,1292.9900,1294.5800,1294.5800,4395070,0.0000,1.0000 241 | 2018-01-18,1293.9500,1304.6000,1284.0200,1293.3200,1293.3200,3941007,0.0000,1.0000 242 | 2018-01-17,1312.2400,1314.0000,1280.8800,1295.0000,1295.0000,5166748,0.0000,1.0000 243 | 2018-01-16,1323.0000,1339.9400,1292.3000,1304.8600,1304.8600,7111172,0.0000,1.0000 244 | 2018-01-12,1273.3900,1305.7600,1273.3900,1305.2000,1305.2000,5360681,0.0000,1.0000 245 | 2018-01-11,1259.7400,1276.7700,1256.4600,1276.6800,1276.6800,3075315,0.0000,1.0000 246 | 2018-01-10,1245.1500,1254.3300,1237.2300,1254.3300,1254.3300,2659507,0.0000,1.0000 247 | 2018-01-09,1256.9000,1259.3300,1241.7600,1252.7000,1252.7000,3646681,0.0000,1.0000 248 | 2018-01-08,1236.0000,1253.0800,1232.0300,1246.8700,1246.8700,4177533,0.0000,1.0000 249 | 2018-01-05,1217.5100,1229.1400,1210.0000,1229.1400,1229.1400,3430148,0.0000,1.0000 250 | 2018-01-04,1205.0000,1215.8700,1204.6600,1209.5900,1209.5900,3000366,0.0000,1.0000 251 | 2018-01-03,1188.3000,1205.4900,1188.3000,1204.2000,1204.2000,3044664,0.0000,1.0000 252 | 2018-01-02,1172.0000,1190.0000,1170.5100,1189.0100,1189.0100,2587899,0.0000,1.0000 253 | -------------------------------------------------------------------------------- /data/AMZN_2019.csv: -------------------------------------------------------------------------------- 1 | timestamp,open,high,low,close,adjusted_close,volume,dividend_amount,split_coefficient 2 | 2019-12-31,1842.0000,1853.2600,1832.2300,1847.8400,1847.8400,2510380,0.0000,1.0000 3 | 2019-12-30,1874.0000,1884.0000,1840.6200,1846.8900,1846.8900,3677306,0.0000,1.0000 4 | 2019-12-27,1882.9200,1901.4000,1866.0100,1869.8000,1869.8000,6188754,0.0000,1.0000 5 | 2019-12-26,1801.0100,1870.4600,1799.5000,1868.7700,1868.7700,6024608,0.0000,1.0000 6 | 2019-12-24,1793.8100,1795.5700,1787.5800,1789.2100,1789.2100,881337,0.0000,1.0000 7 | 2019-12-23,1788.2600,1793.0000,1784.5100,1793.0000,1793.0000,2137493,0.0000,1.0000 8 | 2019-12-20,1799.6200,1802.9700,1782.4500,1786.5000,1786.5000,5152460,0.0000,1.0000 9 | 2019-12-19,1780.5000,1792.9900,1774.0600,1792.2800,1792.2800,2738320,0.0000,1.0000 10 | 2019-12-18,1795.0200,1798.2000,1782.3600,1784.0300,1784.0300,3354137,0.0000,1.0000 11 | 2019-12-17,1778.0100,1792.0000,1777.3900,1790.6600,1790.6600,3646697,0.0000,1.0000 12 | 2019-12-16,1767.0000,1769.5000,1757.0500,1769.2100,1769.2100,3149345,0.0000,1.0000 13 | 2019-12-13,1765.0000,1768.9900,1755.0000,1760.9400,1760.9400,2747909,0.0000,1.0000 14 | 2019-12-12,1750.0000,1764.0000,1745.4400,1760.3300,1760.3300,3103949,0.0000,1.0000 15 | 2019-12-11,1741.6700,1750.0000,1735.7100,1748.7200,1748.7200,2101318,0.0000,1.0000 16 | 2019-12-10,1747.4000,1750.6700,1735.0000,1739.2100,1739.2100,2515644,0.0000,1.0000 17 | 2019-12-09,1750.6600,1766.8900,1745.6100,1749.5100,1749.5100,2502489,0.0000,1.0000 18 | 2019-12-06,1751.2000,1754.4000,1740.1300,1751.6000,1751.6000,3119979,0.0000,1.0000 19 | 2019-12-05,1763.5000,1763.5000,1740.0000,1740.4800,1740.4800,2827852,0.0000,1.0000 20 | 2019-12-04,1774.0100,1789.0900,1760.2200,1760.6900,1760.6900,2680700,0.0000,1.0000 21 | 2019-12-03,1760.0000,1772.8700,1747.2300,1769.9600,1769.9600,3529582,0.0000,1.0000 22 | 2019-12-02,1804.4000,1805.5500,1762.6800,1781.6000,1781.6000,3931750,0.0000,1.0000 23 | 2019-11-29,1817.7800,1824.6900,1800.7900,1800.8000,1800.8000,1923440,0.0000,1.0000 24 | 2019-11-27,1801.0000,1824.5000,1797.3100,1818.5100,1818.5100,3035846,0.0000,1.0000 25 | 2019-11-26,1779.9200,1797.0300,1778.3500,1796.9400,1796.9400,3190428,0.0000,1.0000 26 | 2019-11-25,1753.2500,1777.4200,1753.2400,1773.8400,1773.8400,3489467,0.0000,1.0000 27 | 2019-11-22,1739.0200,1746.4300,1731.0000,1745.7200,1745.7200,2479081,0.0000,1.0000 28 | 2019-11-21,1743.0000,1746.8700,1730.3600,1734.7100,1734.7100,2662938,0.0000,1.0000 29 | 2019-11-20,1749.1400,1762.5200,1734.1200,1745.5300,1745.5300,2793759,0.0000,1.0000 30 | 2019-11-19,1756.9900,1760.6800,1743.0300,1752.7900,1752.7900,2274535,0.0000,1.0000 31 | 2019-11-18,1738.3000,1753.7000,1722.7100,1752.5300,1752.5300,2841907,0.0000,1.0000 32 | 2019-11-15,1760.0500,1761.6800,1732.8600,1739.4900,1739.4900,3931141,0.0000,1.0000 33 | 2019-11-14,1751.4300,1766.5900,1749.5600,1754.6000,1754.6000,2269417,0.0000,1.0000 34 | 2019-11-13,1773.3900,1775.0000,1747.3200,1753.1100,1753.1100,2926892,0.0000,1.0000 35 | 2019-11-12,1774.6600,1786.2200,1771.9100,1778.0000,1778.0000,2038925,0.0000,1.0000 36 | 2019-11-11,1778.0000,1780.0000,1767.1300,1771.6500,1771.6500,1947810,0.0000,1.0000 37 | 2019-11-08,1787.8900,1789.8800,1774.0400,1785.8800,1785.8800,2126198,0.0000,1.0000 38 | 2019-11-07,1803.7600,1805.9000,1783.4800,1788.2000,1788.2000,2651086,0.0000,1.0000 39 | 2019-11-06,1801.0000,1802.5000,1788.5800,1795.7700,1795.7700,2029783,0.0000,1.0000 40 | 2019-11-05,1809.1600,1810.2500,1794.0000,1801.7100,1801.7100,1885543,0.0000,1.0000 41 | 2019-11-04,1801.0100,1815.0600,1801.0100,1804.6600,1804.6600,2771922,0.0000,1.0000 42 | 2019-11-01,1788.0100,1797.4400,1785.2100,1791.4400,1791.4400,2790354,0.0000,1.0000 43 | 2019-10-31,1775.9900,1792.0000,1771.4800,1776.6600,1776.6600,2781185,0.0000,1.0000 44 | 2019-10-30,1759.1200,1782.3800,1759.1200,1779.9900,1779.9900,2449405,0.0000,1.0000 45 | 2019-10-29,1774.8100,1777.0000,1755.8100,1762.7100,1762.7100,2276855,0.0000,1.0000 46 | 2019-10-28,1748.0600,1778.7000,1742.5000,1777.0800,1777.0800,3634788,0.0000,1.0000 47 | 2019-10-25,1697.5500,1764.2100,1695.0000,1761.3300,1761.3300,9626402,0.0000,1.0000 48 | 2019-10-24,1771.0900,1788.3400,1760.2700,1780.7800,1780.7800,5204350,0.0000,1.0000 49 | 2019-10-23,1761.3000,1770.0500,1742.0000,1762.1700,1762.1700,2190380,0.0000,1.0000 50 | 2019-10-22,1788.1500,1789.7800,1762.0000,1765.7300,1765.7300,2234425,0.0000,1.0000 51 | 2019-10-21,1769.6600,1785.8800,1765.0000,1785.6600,1785.6600,2130431,0.0000,1.0000 52 | 2019-10-18,1787.8000,1793.9800,1749.2000,1757.5100,1757.5100,3189382,0.0000,1.0000 53 | 2019-10-17,1796.4900,1798.8500,1782.0200,1787.4800,1787.4800,2713773,0.0000,1.0000 54 | 2019-10-16,1773.3300,1786.2400,1770.5200,1777.4300,1777.4300,2804068,0.0000,1.0000 55 | 2019-10-15,1742.1400,1776.4500,1740.6200,1767.3800,1767.3800,3129244,0.0000,1.0000 56 | 2019-10-14,1728.9100,1741.8900,1722.0000,1736.4300,1736.4300,1928898,0.0000,1.0000 57 | 2019-10-11,1742.9200,1745.4500,1729.8600,1731.9200,1731.9200,3279534,0.0000,1.0000 58 | 2019-10-10,1725.2400,1738.2900,1713.7500,1720.2600,1720.2600,2721531,0.0000,1.0000 59 | 2019-10-09,1719.6100,1729.9500,1714.3600,1721.9900,1721.9900,2089335,0.0000,1.0000 60 | 2019-10-08,1722.4900,1727.0000,1705.0000,1705.5100,1705.5100,2626840,0.0000,1.0000 61 | 2019-10-07,1731.6300,1747.8300,1723.7000,1732.6600,1732.6600,2187598,0.0000,1.0000 62 | 2019-10-04,1726.0200,1740.5800,1719.2300,1739.6500,1739.6500,2489277,0.0000,1.0000 63 | 2019-10-03,1713.0000,1725.0000,1685.0600,1724.4200,1724.4200,3624371,0.0000,1.0000 64 | 2019-10-02,1727.7400,1728.8900,1705.0000,1713.2300,1713.2300,3338476,0.0000,1.0000 65 | 2019-10-01,1746.0000,1755.6000,1728.4100,1735.6500,1735.6500,3170460,0.0000,1.0000 66 | 2019-09-30,1726.9900,1737.4600,1709.2200,1735.9100,1735.9100,2760768,0.0000,1.0000 67 | 2019-09-27,1748.0000,1749.1200,1713.8200,1725.4500,1725.4500,3948029,0.0000,1.0000 68 | 2019-09-26,1762.7900,1763.3700,1731.5000,1739.8400,1739.8400,3571952,0.0000,1.0000 69 | 2019-09-25,1747.3600,1773.0000,1723.0000,1768.3300,1768.3300,3531098,0.0000,1.0000 70 | 2019-09-24,1790.6100,1795.7000,1735.5500,1741.6100,1741.6100,4637901,0.0000,1.0000 71 | 2019-09-23,1777.0000,1792.7000,1767.3200,1785.3000,1785.3000,3139142,0.0000,1.0000 72 | 2019-09-20,1821.7100,1830.6300,1780.9200,1794.1600,1794.1600,5555839,0.0000,1.0000 73 | 2019-09-19,1821.0200,1832.5700,1817.9000,1821.5000,1821.5000,2078335,0.0000,1.0000 74 | 2019-09-18,1817.0400,1822.0600,1795.5000,1817.4600,1817.4600,2536012,0.0000,1.0000 75 | 2019-09-17,1807.0800,1823.9900,1804.1000,1822.5500,1822.5500,2033058,0.0000,1.0000 76 | 2019-09-16,1824.0200,1825.6900,1800.2000,1807.8400,1807.8400,3675473,0.0000,1.0000 77 | 2019-09-13,1842.0100,1846.1200,1835.1700,1839.3400,1839.3400,1971317,0.0000,1.0000 78 | 2019-09-12,1837.6300,1853.6600,1834.2800,1843.5500,1843.5500,2823505,0.0000,1.0000 79 | 2019-09-11,1812.1400,1833.4200,1809.0800,1822.9900,1822.9900,2432767,0.0000,1.0000 80 | 2019-09-10,1822.7500,1825.8100,1805.3400,1820.5500,1820.5500,2613879,0.0000,1.0000 81 | 2019-09-09,1841.0000,1850.0000,1824.6100,1831.3500,1831.3500,2999515,0.0000,1.0000 82 | 2019-09-06,1838.2200,1840.6500,1826.4000,1833.5100,1833.5100,2496933,0.0000,1.0000 83 | 2019-09-05,1821.9500,1842.0000,1815.5800,1840.7200,1840.7200,3325189,0.0000,1.0000 84 | 2019-09-04,1805.0000,1807.6300,1796.2300,1800.6200,1800.6200,2326228,0.0000,1.0000 85 | 2019-09-03,1770.0000,1800.8000,1768.0000,1789.8400,1789.8400,3546859,0.0000,1.0000 86 | 2019-08-30,1797.4900,1799.7400,1764.5700,1776.2900,1776.2900,3064147,0.0000,1.0000 87 | 2019-08-29,1783.0000,1798.5500,1777.2500,1786.4000,1786.4000,3018012,0.0000,1.0000 88 | 2019-08-28,1755.0000,1767.8600,1744.0500,1764.2500,1764.2500,2411125,0.0000,1.0000 89 | 2019-08-27,1775.7300,1779.4000,1746.6800,1761.8300,1761.8300,3027245,0.0000,1.0000 90 | 2019-08-26,1766.9100,1770.0000,1743.5100,1768.8700,1768.8700,3085320,0.0000,1.0000 91 | 2019-08-23,1793.0300,1804.9000,1745.2300,1749.6200,1749.6200,5277898,0.0000,1.0000 92 | 2019-08-22,1828.0000,1829.4100,1800.1000,1805.6000,1805.6000,2658388,0.0000,1.0000 93 | 2019-08-21,1819.3900,1829.5800,1815.0000,1823.5400,1823.5400,2039231,0.0000,1.0000 94 | 2019-08-20,1814.5000,1816.8200,1799.8800,1801.3800,1801.3800,1932835,0.0000,1.0000 95 | 2019-08-19,1818.0800,1826.0000,1812.6100,1816.1200,1816.1200,2820303,0.0000,1.0000 96 | 2019-08-16,1792.8900,1802.9100,1784.5500,1792.5700,1792.5700,3054240,0.0000,1.0000 97 | 2019-08-15,1781.9900,1788.0000,1761.9600,1776.1200,1776.1200,3809948,0.0000,1.0000 98 | 2019-08-14,1793.0100,1795.6500,1757.2100,1762.9600,1762.9600,4893649,0.0000,1.0000 99 | 2019-08-13,1783.0000,1831.7400,1780.0000,1824.3400,1824.3400,4075021,0.0000,1.0000 100 | 2019-08-12,1795.9900,1800.9800,1777.0000,1784.9200,1784.9200,2905498,0.0000,1.0000 101 | 2019-08-09,1828.9500,1831.0900,1802.2200,1807.5800,1807.5800,2879770,0.0000,1.0000 102 | 2019-08-08,1806.0000,1834.2600,1798.1100,1832.8900,1832.8900,3701242,0.0000,1.0000 103 | 2019-08-07,1773.9900,1798.9300,1757.0000,1793.4000,1793.4000,4526884,0.0000,1.0000 104 | 2019-08-06,1792.2300,1793.7700,1753.4000,1787.8300,1787.8300,5070258,0.0000,1.0000 105 | 2019-08-05,1770.2200,1788.6700,1748.7800,1765.1300,1765.1300,6058212,0.0000,1.0000 106 | 2019-08-02,1845.0700,1846.3600,1808.0200,1823.2400,1823.2400,4956225,0.0000,1.0000 107 | 2019-08-01,1871.7200,1897.9200,1844.0100,1855.3200,1855.3200,4713311,0.0000,1.0000 108 | 2019-07-31,1898.1100,1899.5500,1849.4400,1866.7800,1866.7800,4470727,0.0000,1.0000 109 | 2019-07-30,1891.1200,1909.8900,1883.4800,1898.5300,1898.5300,2910888,0.0000,1.0000 110 | 2019-07-29,1930.0000,1932.2300,1890.5400,1912.4500,1912.4500,4493190,0.0000,1.0000 111 | 2019-07-26,1942.0000,1950.8900,1924.5100,1943.0500,1943.0500,4927143,0.0000,1.0000 112 | 2019-07-25,2001.0000,2001.2000,1972.7200,1973.8200,1973.8200,4136394,0.0000,1.0000 113 | 2019-07-24,1969.3000,2001.3000,1965.8700,2000.8100,2000.8100,2631300,0.0000,1.0000 114 | 2019-07-23,1995.9900,1997.7900,1973.1300,1994.4900,1994.4900,2703480,0.0000,1.0000 115 | 2019-07-22,1971.1400,1989.0000,1958.2600,1985.6300,1985.6300,2908111,0.0000,1.0000 116 | 2019-07-19,1991.2100,1996.0000,1962.2300,1964.5200,1964.5200,3185612,0.0000,1.0000 117 | 2019-07-18,1980.0100,1987.5000,1951.5500,1977.9000,1977.9000,3504252,0.0000,1.0000 118 | 2019-07-17,2007.0500,2012.0000,1992.0300,1992.0300,1992.0300,2558809,0.0000,1.0000 119 | 2019-07-16,2010.5800,2026.3200,2001.2200,2009.9000,2009.9000,2618198,0.0000,1.0000 120 | 2019-07-15,2021.4000,2022.9000,2001.5500,2020.9900,2020.9900,2981343,0.0000,1.0000 121 | 2019-07-12,2008.2700,2017.0000,2003.8700,2011.0000,2011.0000,2509297,0.0000,1.0000 122 | 2019-07-11,2025.6200,2035.8000,1995.3000,2001.0700,2001.0700,4317766,0.0000,1.0000 123 | 2019-07-10,1996.5100,2024.9400,1995.4000,2017.4100,2017.4100,4931902,0.0000,1.0000 124 | 2019-07-09,1947.8000,1990.0100,1943.4700,1988.3000,1988.3000,4345698,0.0000,1.0000 125 | 2019-07-08,1934.1200,1956.0000,1928.2500,1952.3200,1952.3200,2883371,0.0000,1.0000 126 | 2019-07-05,1928.6000,1945.9000,1925.3000,1942.9100,1942.9100,2628359,0.0000,1.0000 127 | 2019-07-03,1935.8900,1941.5900,1930.5000,1939.0000,1939.0000,1690294,0.0000,1.0000 128 | 2019-07-02,1919.3800,1934.7900,1906.6300,1934.3100,1934.3100,2651299,0.0000,1.0000 129 | 2019-07-01,1922.9800,1929.8200,1914.6600,1922.1900,1922.1900,3203347,0.0000,1.0000 130 | 2019-06-28,1909.1000,1912.9400,1884.0000,1893.6300,1893.6300,3037358,0.0000,1.0000 131 | 2019-06-27,1902.0000,1911.2400,1898.0400,1904.2800,1904.2800,2141721,0.0000,1.0000 132 | 2019-06-26,1892.4800,1903.8000,1887.3200,1897.8300,1897.8300,2441910,0.0000,1.0000 133 | 2019-06-25,1911.8400,1916.3800,1872.4200,1878.2700,1878.2700,3012347,0.0000,1.0000 134 | 2019-06-24,1912.6600,1916.8600,1901.3000,1913.9000,1913.9000,2282969,0.0000,1.0000 135 | 2019-06-21,1916.1000,1925.9500,1907.5800,1911.3000,1911.3000,3933576,0.0000,1.0000 136 | 2019-06-20,1933.3300,1935.2000,1905.8000,1918.1900,1918.1900,3217153,0.0000,1.0000 137 | 2019-06-19,1907.8400,1919.5800,1892.4700,1908.7900,1908.7900,2895347,0.0000,1.0000 138 | 2019-06-18,1901.3500,1921.6700,1899.7900,1901.3700,1901.3700,3895728,0.0000,1.0000 139 | 2019-06-17,1876.5000,1895.6900,1875.4500,1886.0300,1886.0300,2634342,0.0000,1.0000 140 | 2019-06-14,1864.0000,1876.0000,1859.0000,1869.6700,1869.6700,2851163,0.0000,1.0000 141 | 2019-06-13,1866.7200,1883.0900,1862.2200,1870.3000,1870.3000,2795810,0.0000,1.0000 142 | 2019-06-12,1853.9800,1865.0000,1844.3800,1855.3200,1855.3200,2678335,0.0000,1.0000 143 | 2019-06-11,1883.2500,1893.7000,1858.0000,1863.7000,1863.7000,4042694,0.0000,1.0000 144 | 2019-06-10,1822.0000,1884.8700,1818.0000,1860.6300,1860.6300,5371007,0.0000,1.0000 145 | 2019-06-07,1763.7000,1806.2500,1759.4900,1804.0300,1804.0300,4808246,0.0000,1.0000 146 | 2019-06-06,1737.7100,1760.0000,1726.1300,1754.3600,1754.3600,3689272,0.0000,1.0000 147 | 2019-06-05,1749.6000,1752.0000,1715.2500,1738.5000,1738.5000,4239782,0.0000,1.0000 148 | 2019-06-04,1699.2400,1730.8200,1680.8900,1729.5600,1729.5600,5679121,0.0000,1.0000 149 | 2019-06-03,1760.0100,1766.2900,1672.0000,1692.6900,1692.6900,9098708,0.0000,1.0000 150 | 2019-05-31,1790.0100,1795.5900,1772.7000,1775.0700,1775.0700,4618819,0.0000,1.0000 151 | 2019-05-30,1825.4900,1829.4700,1807.8300,1816.3200,1816.3200,3146850,0.0000,1.0000 152 | 2019-05-29,1823.1200,1830.0000,1807.5300,1819.1900,1819.1900,4279025,0.0000,1.0000 153 | 2019-05-28,1832.7500,1849.2700,1827.3500,1836.4300,1836.4300,3199965,0.0000,1.0000 154 | 2019-05-24,1835.8900,1841.7600,1817.8500,1823.2800,1823.2800,3369673,0.0000,1.0000 155 | 2019-05-23,1836.5900,1844.0000,1804.2000,1815.4800,1815.4800,4424265,0.0000,1.0000 156 | 2019-05-22,1851.7800,1871.4800,1851.0000,1859.6800,1859.6800,2936601,0.0000,1.0000 157 | 2019-05-21,1874.7900,1879.0000,1846.0000,1857.5200,1857.5200,4005122,0.0000,1.0000 158 | 2019-05-20,1852.6900,1867.7800,1835.5400,1858.9700,1858.9700,3798198,0.0000,1.0000 159 | 2019-05-17,1893.0500,1910.5300,1867.3300,1869.0000,1869.0000,4736618,0.0000,1.0000 160 | 2019-05-16,1885.9400,1917.5100,1882.2900,1907.5700,1907.5700,4707822,0.0000,1.0000 161 | 2019-05-15,1827.9500,1874.4300,1823.0000,1871.1500,1871.1500,4692642,0.0000,1.0000 162 | 2019-05-14,1839.5000,1852.4400,1815.7500,1840.1200,1840.1200,4629107,0.0000,1.0000 163 | 2019-05-13,1836.5600,1846.5400,1818.0000,1822.6800,1822.6800,5783410,0.0000,1.0000 164 | 2019-05-10,1898.0000,1903.7900,1856.0000,1889.9800,1889.9800,5717994,0.0000,1.0000 165 | 2019-05-09,1900.0000,1909.4000,1876.0000,1899.8700,1899.8700,5308263,0.0000,1.0000 166 | 2019-05-08,1918.8700,1935.3700,1910.0000,1917.7700,1917.7700,4078568,0.0000,1.0000 167 | 2019-05-07,1939.9900,1949.1000,1903.3800,1921.0000,1921.0000,5902134,0.0000,1.0000 168 | 2019-05-06,1917.9800,1959.0000,1910.5000,1950.5500,1950.5500,5417841,0.0000,1.0000 169 | 2019-05-03,1949.0000,1964.4000,1936.0000,1962.4600,1962.4600,6381564,0.0000,1.0000 170 | 2019-05-02,1913.3300,1921.5500,1881.8700,1900.8200,1900.8200,3962915,0.0000,1.0000 171 | 2019-05-01,1933.0900,1943.6400,1910.5500,1911.5200,1911.5200,3116964,0.0000,1.0000 172 | 2019-04-30,1930.1000,1935.7100,1906.9500,1926.5200,1926.5200,3506007,0.0000,1.0000 173 | 2019-04-29,1949.0000,1956.3400,1934.0900,1938.4300,1938.4300,4021255,0.0000,1.0000 174 | 2019-04-26,1929.0000,1951.0000,1898.0000,1950.6300,1950.6300,8432563,0.0000,1.0000 175 | 2019-04-25,1917.0000,1922.4500,1900.3100,1902.2500,1902.2500,6099101,0.0000,1.0000 176 | 2019-04-24,1925.0000,1929.6900,1898.1600,1901.7500,1901.7500,3675781,0.0000,1.0000 177 | 2019-04-23,1891.2000,1929.2600,1889.5800,1923.7700,1923.7700,4640441,0.0000,1.0000 178 | 2019-04-22,1855.4000,1888.4200,1845.6400,1887.3100,1887.3100,3373807,0.0000,1.0000 179 | 2019-04-18,1868.7900,1870.8200,1859.4800,1861.6900,1861.6900,2749882,0.0000,1.0000 180 | 2019-04-17,1872.9900,1876.4700,1860.4400,1864.8200,1864.8200,2893517,0.0000,1.0000 181 | 2019-04-16,1851.3500,1869.7700,1848.0000,1863.0400,1863.0400,3044618,0.0000,1.0000 182 | 2019-04-15,1842.0000,1846.8500,1818.9000,1844.8700,1844.8700,3724423,0.0000,1.0000 183 | 2019-04-12,1848.4000,1851.5000,1841.3000,1843.0600,1843.0600,3114413,0.0000,1.0000 184 | 2019-04-11,1848.7000,1849.9500,1840.3100,1844.0700,1844.0700,2654842,0.0000,1.0000 185 | 2019-04-10,1841.0000,1848.0000,1828.8100,1847.3300,1847.3300,2963973,0.0000,1.0000 186 | 2019-04-09,1845.4900,1853.0900,1831.7800,1835.8400,1835.8400,3714368,0.0000,1.0000 187 | 2019-04-08,1833.2300,1850.2000,1825.1100,1849.8600,1849.8600,3752841,0.0000,1.0000 188 | 2019-04-05,1829.0000,1838.5800,1825.1900,1837.2800,1837.2800,3640476,0.0000,1.0000 189 | 2019-04-04,1820.6500,1828.7500,1804.2000,1818.8600,1818.8600,3623867,0.0000,1.0000 190 | 2019-04-03,1826.7200,1830.0000,1809.6200,1820.7000,1820.7000,3980590,0.0000,1.0000 191 | 2019-04-02,1811.0200,1820.0000,1805.1200,1813.9800,1813.9800,3448115,0.0000,1.0000 192 | 2019-04-01,1800.1100,1815.6700,1798.7300,1814.1900,1814.1900,4238752,0.0000,1.0000 193 | 2019-03-29,1786.5800,1792.8600,1776.6300,1780.7500,1780.7500,3320793,0.0000,1.0000 194 | 2019-03-28,1770.0000,1777.9300,1753.4700,1773.4200,1773.4200,3042958,0.0000,1.0000 195 | 2019-03-27,1784.1300,1787.5000,1745.6800,1765.7000,1765.7000,4324801,0.0000,1.0000 196 | 2019-03-26,1793.0000,1805.7700,1773.3600,1783.7600,1783.7600,4865880,0.0000,1.0000 197 | 2019-03-25,1757.7900,1782.6800,1747.5000,1774.2600,1774.2600,5103803,0.0000,1.0000 198 | 2019-03-22,1810.1700,1818.9800,1763.1100,1764.7700,1764.7700,6362983,0.0000,1.0000 199 | 2019-03-21,1796.2600,1823.7500,1787.2800,1819.2600,1819.2600,5767797,0.0000,1.0000 200 | 2019-03-20,1769.9400,1799.5000,1767.0300,1797.2700,1797.2700,6265633,0.0000,1.0000 201 | 2019-03-19,1753.5100,1784.1600,1753.5100,1761.8500,1761.8500,6364161,0.0000,1.0000 202 | 2019-03-18,1712.7000,1750.0000,1712.6300,1742.1500,1742.1500,5429058,0.0000,1.0000 203 | 2019-03-15,1703.0000,1718.8000,1693.1300,1712.3600,1712.3600,7550870,0.0000,1.0000 204 | 2019-03-14,1691.2000,1702.0000,1684.3400,1686.2200,1686.2200,2946618,0.0000,1.0000 205 | 2019-03-13,1683.0000,1700.0000,1679.3500,1690.8100,1690.8100,3552041,0.0000,1.0000 206 | 2019-03-12,1669.0000,1684.2700,1660.9800,1673.1000,1673.1000,3614498,0.0000,1.0000 207 | 2019-03-11,1626.1200,1672.2900,1626.0100,1670.6200,1670.6200,3876352,0.0000,1.0000 208 | 2019-03-08,1604.0100,1622.7200,1586.5700,1620.8000,1620.8000,4667014,0.0000,1.0000 209 | 2019-03-07,1667.3700,1669.7500,1620.5100,1625.9500,1625.9500,4957017,0.0000,1.0000 210 | 2019-03-06,1695.9700,1697.7500,1668.2800,1668.9500,1668.9500,3996001,0.0000,1.0000 211 | 2019-03-05,1702.9500,1707.8000,1689.0100,1692.4300,1692.4300,3681522,0.0000,1.0000 212 | 2019-03-04,1685.0000,1709.4300,1674.3600,1696.1700,1696.1700,6167358,0.0000,1.0000 213 | 2019-03-01,1655.1300,1674.2600,1651.0000,1671.7300,1671.7300,4974877,0.0000,1.0000 214 | 2019-02-28,1635.2500,1651.7700,1633.8300,1639.8300,1639.8300,3025891,0.0000,1.0000 215 | 2019-02-27,1628.1800,1641.8100,1615.1000,1641.0900,1641.0900,3148824,0.0000,1.0000 216 | 2019-02-26,1625.9800,1639.9900,1616.1300,1636.4000,1636.4000,2665815,0.0000,1.0000 217 | 2019-02-25,1641.4500,1654.6000,1630.3900,1633.0000,1633.0000,3184462,0.0000,1.0000 218 | 2019-02-22,1623.5000,1634.9400,1621.1700,1631.5600,1631.5600,3096191,0.0000,1.0000 219 | 2019-02-21,1619.8500,1623.5600,1600.9100,1619.4400,1619.4400,3483392,0.0000,1.0000 220 | 2019-02-20,1630.0000,1634.9300,1610.1200,1622.1000,1622.1000,3337589,0.0000,1.0000 221 | 2019-02-19,1601.0000,1634.0000,1600.5600,1627.5800,1627.5800,3681656,0.0000,1.0000 222 | 2019-02-15,1627.8600,1628.9100,1604.5000,1607.9500,1607.9500,4343893,0.0000,1.0000 223 | 2019-02-14,1624.5000,1637.9000,1606.0600,1622.6500,1622.6500,4120524,0.0000,1.0000 224 | 2019-02-13,1647.0000,1656.3800,1637.1100,1640.0000,1640.0000,3560321,0.0000,1.0000 225 | 2019-02-12,1604.0000,1639.3900,1598.8800,1638.0100,1638.0100,4858604,0.0000,1.0000 226 | 2019-02-11,1600.9800,1609.2900,1586.0000,1591.0000,1591.0000,3317328,0.0000,1.0000 227 | 2019-02-08,1586.0000,1588.5900,1566.7600,1588.2200,1588.2200,5657457,0.0000,1.0000 228 | 2019-02-07,1625.0000,1625.5400,1592.9100,1614.3700,1614.3700,4626589,0.0000,1.0000 229 | 2019-02-06,1670.7500,1672.2600,1633.3400,1640.2600,1640.2600,3939883,0.0000,1.0000 230 | 2019-02-05,1643.3400,1665.2600,1642.5000,1658.8100,1658.8100,4453105,0.0000,1.0000 231 | 2019-02-04,1623.0000,1649.6300,1613.5000,1633.3100,1633.3100,4929187,0.0000,1.0000 232 | 2019-02-01,1638.8800,1673.0600,1622.0100,1626.2300,1626.2300,11506213,0.0000,1.0000 233 | 2019-01-31,1692.8500,1736.4100,1679.0800,1718.7300,1718.7300,10910338,0.0000,1.0000 234 | 2019-01-30,1623.0000,1676.9500,1619.6800,1670.4300,1670.4300,5783822,0.0000,1.0000 235 | 2019-01-29,1631.2700,1632.3800,1590.7200,1593.8800,1593.8800,4632782,0.0000,1.0000 236 | 2019-01-28,1643.5900,1645.0000,1614.0900,1637.8900,1637.8900,4837711,0.0000,1.0000 237 | 2019-01-25,1670.5000,1683.4800,1661.6100,1670.5700,1670.5700,4959679,0.0000,1.0000 238 | 2019-01-24,1641.0700,1657.2600,1631.7800,1654.9300,1654.9300,4089943,0.0000,1.0000 239 | 2019-01-23,1656.0000,1657.4300,1612.0000,1640.0200,1640.0200,5225212,0.0000,1.0000 240 | 2019-01-22,1681.0000,1681.8700,1610.2000,1632.1700,1632.1700,6416796,0.0000,1.0000 241 | 2019-01-18,1712.0000,1716.2000,1691.5400,1696.2000,1696.2000,6020503,0.0000,1.0000 242 | 2019-01-17,1680.0000,1700.1700,1677.5000,1693.2200,1693.2200,4208875,0.0000,1.0000 243 | 2019-01-16,1684.2200,1705.0000,1675.8800,1683.7800,1683.7800,6366864,0.0000,1.0000 244 | 2019-01-15,1632.0000,1675.1600,1626.0100,1674.5600,1674.5600,5998510,0.0000,1.0000 245 | 2019-01-14,1615.0000,1648.2000,1595.1500,1617.2100,1617.2100,6005888,0.0000,1.0000 246 | 2019-01-11,1640.5500,1660.2900,1636.2200,1640.5600,1640.5600,4686222,0.0000,1.0000 247 | 2019-01-10,1641.0100,1663.2500,1621.6200,1656.2200,1656.2200,6507693,0.0000,1.0000 248 | 2019-01-09,1652.9800,1667.8000,1641.4000,1659.4200,1659.4200,6348801,0.0000,1.0000 249 | 2019-01-08,1664.6900,1676.6100,1616.6100,1656.5800,1656.5800,8881428,0.0000,1.0000 250 | 2019-01-07,1602.3100,1634.5600,1589.1800,1629.5100,1629.5100,7993213,0.0000,1.0000 251 | 2019-01-04,1530.0000,1594.0000,1518.3100,1575.3900,1575.3900,9182575,0.0000,1.0000 252 | 2019-01-03,1520.0100,1538.0000,1497.1100,1500.2800,1500.2800,6975572,0.0000,1.0000 253 | 2019-01-02,1465.2000,1553.3600,1460.9300,1539.1300,1539.1300,7983103,0.0000,1.0000 254 | -------------------------------------------------------------------------------- /data/GOOG_2018.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Adj Close,Volume 2 | 2017-08-10,935.000000,936.299988,921.780029,923.590027,923.590027,2707400 3 | 2017-08-11,923.710022,933.359985,921.219971,930.090027,930.090027,1616700 4 | 2017-08-14,939.070007,941.039978,934.489990,938.929993,938.929993,1148500 5 | 2017-08-15,941.030029,943.070007,936.640015,938.080017,938.080017,1106500 6 | 2017-08-16,941.250000,949.900024,940.039978,944.270020,944.270020,1345300 7 | 2017-08-17,942.950012,943.809998,927.640015,927.659973,927.659973,1695700 8 | 2017-08-18,926.979980,931.020020,923.450012,926.179993,926.179993,1337400 9 | 2017-08-21,925.770020,928.250000,918.599976,920.869995,920.869995,1301200 10 | 2017-08-22,926.960022,941.960022,926.169983,940.400024,940.400024,1775100 11 | 2017-08-23,937.000000,945.429993,935.239990,942.580017,942.580017,1134500 12 | 2017-08-24,943.710022,946.309998,930.739990,936.890015,936.890015,1294600 13 | 2017-08-25,939.210022,940.729980,930.099976,930.500000,930.500000,1187300 14 | 2017-08-28,931.880005,934.849976,926.109985,928.130005,928.130005,1049400 15 | 2017-08-29,919.950012,938.190002,919.309998,935.750000,935.750000,1158600 16 | 2017-08-30,935.669983,945.859985,934.049988,943.630005,943.630005,1120300 17 | 2017-08-31,946.299988,957.200012,946.250000,955.239990,955.239990,1693300 18 | 2017-09-01,957.469971,958.330017,950.280029,951.989990,951.989990,1042900 19 | 2017-09-05,946.859985,951.390015,935.599976,941.479980,941.479980,1457400 20 | 2017-09-06,943.869995,944.500000,932.679993,942.020020,942.020020,1391500 21 | 2017-09-07,944.250000,950.500000,937.530029,949.890015,949.890015,1116600 22 | 2017-09-08,949.700012,950.700012,940.010010,941.409973,941.409973,999900 23 | 2017-09-11,947.200012,952.679993,941.000000,943.289978,943.289978,1337400 24 | 2017-09-12,946.919983,948.090027,937.500000,946.650024,946.650024,1284800 25 | 2017-09-13,945.500000,952.849976,944.739990,950.440002,950.440002,1095400 26 | 2017-09-14,946.000000,948.030029,938.359985,940.130005,940.130005,1427400 27 | 2017-09-15,940.090027,941.750000,931.250000,935.289978,935.289978,1994300 28 | 2017-09-18,935.010010,936.859985,925.400024,929.750000,929.750000,1473700 29 | 2017-09-19,933.409973,937.940002,926.659973,936.859985,936.859985,1242700 30 | 2017-09-20,937.729980,950.000000,937.500000,947.539978,947.539978,2004000 31 | 2017-09-21,948.130005,952.799988,939.380005,947.549988,947.549988,1370700 32 | 2017-09-22,942.770020,950.000000,940.840027,943.260010,943.260010,1074800 33 | 2017-09-25,939.450012,939.750000,924.510010,934.280029,934.280029,1873400 34 | 2017-09-26,936.690002,944.080017,935.119995,937.429993,937.429993,1672700 35 | 2017-09-27,942.739990,965.429993,941.950012,959.900024,959.900024,2334600 36 | 2017-09-28,956.250000,966.179993,955.549988,964.809998,964.809998,1400900 37 | 2017-09-29,966.000000,975.809998,966.000000,973.719971,973.719971,2031100 38 | 2017-10-02,975.650024,977.739990,961.950012,967.469971,967.469971,1539100 39 | 2017-10-03,967.559998,972.440002,962.710022,972.080017,972.080017,1083300 40 | 2017-10-04,971.760010,974.400024,965.609985,966.780029,966.780029,1057800 41 | 2017-10-05,972.789978,986.510010,970.270020,985.190002,985.190002,1780900 42 | 2017-10-06,980.000000,994.260010,978.510010,993.640015,993.640015,1553000 43 | 2017-10-09,995.000000,1000.460022,991.500000,992.309998,992.309998,1295500 44 | 2017-10-10,995.299988,997.469971,981.109985,987.799988,987.799988,1163400 45 | 2017-10-11,989.039978,1007.570007,987.940002,1005.650024,1005.650024,1815000 46 | 2017-10-12,1003.840027,1011.539978,1001.099976,1005.650024,1005.650024,1530700 47 | 2017-10-13,1009.109985,1014.760010,1007.059998,1007.869995,1007.869995,1327600 48 | 2017-10-16,1009.630005,1012.000000,1001.520020,1009.349976,1009.349976,1071000 49 | 2017-10-17,1007.440002,1014.559998,1006.049988,1011.000000,1011.000000,1013000 50 | 2017-10-18,1011.049988,1016.309998,1005.320007,1012.739990,1012.739990,1279800 51 | 2017-10-19,1004.750000,1007.320007,997.299988,1001.840027,1001.840027,1714200 52 | 2017-10-20,1007.049988,1008.650024,1002.270020,1005.070007,1005.070007,1606000 53 | 2017-10-23,1005.179993,1005.789978,983.099976,985.539978,985.539978,1639300 54 | 2017-10-24,986.500000,989.260010,977.080017,988.489990,988.489990,1445100 55 | 2017-10-25,986.270020,994.429993,977.719971,991.460022,991.460022,1528700 56 | 2017-10-26,998.469971,1006.510010,990.469971,991.419983,991.419983,2369800 57 | 2017-10-27,1030.989990,1063.619995,1026.849976,1033.670044,1033.670044,5184100 58 | 2017-10-30,1029.160034,1039.829956,1022.330017,1033.130005,1033.130005,2340200 59 | 2017-10-31,1033.000000,1041.000000,1026.300049,1033.040039,1033.040039,1516300 60 | 2017-11-01,1036.319946,1047.859985,1034.000000,1042.599976,1042.599976,2163100 61 | 2017-11-02,1039.989990,1045.520020,1028.660034,1042.969971,1042.969971,1334700 62 | 2017-11-03,1042.750000,1050.660034,1037.650024,1049.989990,1049.989990,1388500 63 | 2017-11-06,1049.099976,1052.589966,1042.000000,1042.680054,1042.680054,914700 64 | 2017-11-07,1049.650024,1053.410034,1043.000000,1052.390015,1052.390015,1305200 65 | 2017-11-08,1050.050049,1062.689941,1047.050049,1058.290039,1058.290039,1213800 66 | 2017-11-09,1048.000000,1050.880005,1035.849976,1047.719971,1047.719971,1794600 67 | 2017-11-10,1043.869995,1046.630005,1041.219971,1044.150024,1044.150024,972100 68 | 2017-11-13,1040.800049,1048.739990,1039.260010,1041.199951,1041.199951,940700 69 | 2017-11-14,1037.719971,1042.300049,1029.329956,1041.640015,1041.640015,1050600 70 | 2017-11-15,1035.000000,1039.630005,1030.760010,1036.410034,1036.410034,905300 71 | 2017-11-16,1038.750000,1051.760010,1038.000000,1048.469971,1048.469971,1188400 72 | 2017-11-17,1049.800049,1051.000000,1033.729980,1035.890015,1035.890015,1335600 73 | 2017-11-20,1036.000000,1038.699951,1032.680054,1034.660034,1034.660034,876300 74 | 2017-11-21,1040.040039,1050.390015,1039.140015,1050.300049,1050.300049,1110300 75 | 2017-11-22,1051.160034,1055.430054,1047.250000,1051.920044,1051.920044,726900 76 | 2017-11-24,1054.390015,1060.069946,1051.920044,1056.520020,1056.520020,824600 77 | 2017-11-27,1058.569946,1073.040039,1054.770020,1072.010010,1072.010010,1771500 78 | 2017-11-28,1073.989990,1080.000000,1054.540039,1063.290039,1063.290039,1821200 79 | 2017-11-29,1056.180054,1058.770020,1029.650024,1037.380005,1037.380005,2793300 80 | 2017-11-30,1039.939941,1044.140015,1030.069946,1036.170044,1036.170044,2254600 81 | 2017-12-01,1030.410034,1037.239990,1016.900024,1025.069946,1025.069946,1888100 82 | 2017-12-04,1027.800049,1031.339966,1009.219971,1011.869995,1011.869995,1938900 83 | 2017-12-05,1010.989990,1036.680054,1002.320007,1019.599976,1019.599976,1949900 84 | 2017-12-06,1016.520020,1039.579956,1015.309998,1032.719971,1032.719971,1435500 85 | 2017-12-07,1036.069946,1048.920044,1035.359985,1044.569946,1044.569946,1543300 86 | 2017-12-08,1051.810059,1056.420044,1045.859985,1049.380005,1049.380005,1558500 87 | 2017-12-11,1051.109985,1056.000000,1044.119995,1051.969971,1051.969971,1162700 88 | 2017-12-12,1050.000000,1062.500000,1044.869995,1048.770020,1048.770020,1694100 89 | 2017-12-13,1052.079956,1055.479980,1046.579956,1051.390015,1051.390015,1384000 90 | 2017-12-14,1055.489990,1067.079956,1053.599976,1057.469971,1057.469971,1548100 91 | 2017-12-15,1063.780029,1075.250000,1060.089966,1072.000000,1072.000000,3188000 92 | 2017-12-18,1076.449951,1086.489990,1070.369995,1085.089966,1085.089966,1514600 93 | 2017-12-19,1083.020020,1084.969971,1072.270020,1079.780029,1079.780029,1317500 94 | 2017-12-20,1080.920044,1081.229980,1068.599976,1073.560059,1073.560059,1436400 95 | 2017-12-21,1075.390015,1077.520020,1069.000000,1070.849976,1070.849976,1282000 96 | 2017-12-22,1070.000000,1071.719971,1067.640015,1068.859985,1068.859985,889400 97 | 2017-12-26,1068.640015,1068.859985,1058.640015,1065.849976,1065.849976,918800 98 | 2017-12-27,1066.599976,1068.270020,1058.380005,1060.199951,1060.199951,1116200 99 | 2017-12-28,1062.250000,1064.839966,1053.380005,1055.949951,1055.949951,994200 100 | 2017-12-29,1055.489990,1058.050049,1052.699951,1053.400024,1053.400024,1180300 101 | 2018-01-02,1053.020020,1075.979980,1053.020020,1073.209961,1073.209961,1588300 102 | 2018-01-03,1073.930054,1096.099976,1073.430054,1091.520020,1091.520020,1565900 103 | 2018-01-04,1097.089966,1104.079956,1094.260010,1095.760010,1095.760010,1302600 104 | 2018-01-05,1103.449951,1113.579956,1101.800049,1110.290039,1110.290039,1512500 105 | 2018-01-08,1111.000000,1119.160034,1110.000000,1114.209961,1114.209961,1232200 106 | 2018-01-09,1118.439941,1118.439941,1108.199951,1112.790039,1112.790039,1340400 107 | 2018-01-10,1107.000000,1112.780029,1103.979980,1110.140015,1110.140015,1036700 108 | 2018-01-11,1112.310059,1114.849976,1106.479980,1112.050049,1112.050049,1121200 109 | 2018-01-12,1110.099976,1131.300049,1108.010010,1130.650024,1130.650024,1929300 110 | 2018-01-16,1140.310059,1148.880005,1126.660034,1130.699951,1130.699951,1823100 111 | 2018-01-17,1136.359985,1139.319946,1123.489990,1139.099976,1139.099976,1386400 112 | 2018-01-18,1139.349976,1140.589966,1124.459961,1135.969971,1135.969971,1374900 113 | 2018-01-19,1138.030029,1143.780029,1132.500000,1143.500000,1143.500000,1527600 114 | 2018-01-22,1143.819946,1166.880005,1141.819946,1164.160034,1164.160034,1477500 115 | 2018-01-23,1170.619995,1178.510010,1167.250000,1176.170044,1176.170044,1956900 116 | 2018-01-24,1184.979980,1187.050049,1167.400024,1171.290039,1171.290039,1856400 117 | 2018-01-25,1180.709961,1185.000000,1171.839966,1182.140015,1182.140015,1499200 118 | 2018-01-26,1187.530029,1187.560059,1168.030029,1187.560059,1187.560059,2108500 119 | 2018-01-29,1188.000000,1198.000000,1184.060059,1186.479980,1186.479980,1574700 120 | 2018-01-30,1177.719971,1187.930054,1174.510010,1177.369995,1177.369995,1866900 121 | 2018-01-31,1183.810059,1186.319946,1172.099976,1182.219971,1182.219971,1801100 122 | 2018-02-01,1175.989990,1187.449951,1169.359985,1181.589966,1181.589966,3675700 123 | 2018-02-02,1127.420044,1131.300049,1111.170044,1119.199951,1119.199951,5892100 124 | 2018-02-05,1100.609985,1114.989990,1056.739990,1062.390015,1062.390015,4177500 125 | 2018-02-06,1033.979980,1087.380005,1030.010010,1084.430054,1084.430054,3831500 126 | 2018-02-07,1084.969971,1086.530029,1054.619995,1055.410034,1055.410034,2597100 127 | 2018-02-08,1059.869995,1063.930054,1004.700012,1007.710022,1007.710022,3339600 128 | 2018-02-09,1025.880005,1051.719971,997.000000,1046.270020,1046.270020,4918000 129 | 2018-02-12,1056.670044,1065.569946,1045.489990,1054.560059,1054.560059,2812000 130 | 2018-02-13,1050.000000,1061.219971,1046.920044,1054.140015,1054.140015,1579300 131 | 2018-02-14,1054.319946,1075.469971,1049.800049,1072.699951,1072.699951,2065200 132 | 2018-02-15,1083.449951,1094.099976,1067.229980,1091.359985,1091.359985,1869800 133 | 2018-02-16,1093.380005,1108.310059,1091.550049,1095.500000,1095.500000,1997400 134 | 2018-02-20,1092.760010,1116.290039,1090.000000,1103.589966,1103.589966,1687700 135 | 2018-02-21,1109.099976,1136.199951,1107.510010,1113.750000,1113.750000,2074300 136 | 2018-02-22,1119.170044,1125.459961,1105.150024,1109.900024,1109.900024,1400500 137 | 2018-02-23,1118.660034,1129.000000,1108.439941,1128.089966,1128.089966,1264600 138 | 2018-02-26,1131.859985,1144.199951,1129.339966,1143.699951,1143.699951,1545600 139 | 2018-02-27,1143.699951,1144.250000,1116.790039,1117.510010,1117.510010,2148200 140 | 2018-02-28,1122.000000,1127.650024,1103.000000,1103.920044,1103.920044,2464600 141 | 2018-03-01,1109.540039,1111.270020,1067.290039,1071.410034,1071.410034,2766900 142 | 2018-03-02,1057.979980,1086.890015,1050.109985,1084.140015,1084.140015,2508100 143 | 2018-03-05,1078.130005,1101.180054,1072.270020,1094.760010,1094.760010,1432400 144 | 2018-03-06,1102.099976,1105.630005,1094.500000,1100.900024,1100.900024,1169100 145 | 2018-03-07,1092.819946,1116.199951,1089.910034,1115.040039,1115.040039,1537400 146 | 2018-03-08,1117.199951,1131.439941,1117.199951,1129.380005,1129.380005,1693100 147 | 2018-03-09,1139.500000,1161.000000,1134.290039,1160.839966,1160.839966,2133100 148 | 2018-03-12,1165.050049,1178.160034,1159.199951,1165.930054,1165.930054,2215300 149 | 2018-03-13,1171.829956,1178.000000,1134.569946,1139.910034,1139.910034,2157000 150 | 2018-03-14,1145.800049,1159.760010,1142.349976,1148.890015,1148.890015,2093500 151 | 2018-03-15,1149.569946,1162.500000,1135.660034,1150.609985,1150.609985,1669100 152 | 2018-03-16,1155.349976,1156.810059,1131.359985,1134.420044,1134.420044,2932800 153 | 2018-03-19,1117.760010,1119.369995,1088.920044,1100.069946,1100.069946,3182800 154 | 2018-03-20,1098.400024,1105.550049,1082.420044,1095.800049,1095.800049,2729900 155 | 2018-03-21,1092.569946,1108.699951,1087.209961,1094.000000,1094.000000,2244900 156 | 2018-03-22,1080.010010,1083.920044,1049.640015,1053.150024,1053.150024,3465600 157 | 2018-03-23,1051.369995,1066.780029,1024.869995,1026.550049,1026.550049,2494000 158 | 2018-03-26,1050.599976,1059.270020,1010.580017,1054.089966,1054.089966,3299200 159 | 2018-03-27,1063.900024,1064.540039,997.619995,1006.940002,1006.940002,3040800 160 | 2018-03-28,1001.909973,1024.989990,984.000000,1005.179993,1005.179993,3884900 161 | 2018-03-29,1011.210022,1048.050049,1004.039978,1037.140015,1037.140015,3466900 162 | 2018-04-02,1027.619995,1039.530029,994.250000,1012.630005,1012.630005,3253400 163 | 2018-04-03,1016.150024,1025.000000,997.250000,1018.679993,1018.679993,2566100 164 | 2018-04-04,998.229980,1032.739990,996.510010,1029.709961,1029.709961,2536200 165 | 2018-04-05,1046.390015,1046.709961,1024.000000,1032.640015,1032.640015,1791800 166 | 2018-04-06,1023.099976,1036.000000,1006.250000,1009.950012,1009.950012,2006700 167 | 2018-04-09,1020.039978,1044.589966,1019.200012,1020.090027,1020.090027,1661000 168 | 2018-04-10,1030.260010,1041.209961,1015.409973,1036.500000,1036.500000,1831000 169 | 2018-04-11,1032.000000,1035.869995,1019.200012,1025.060059,1025.060059,1703000 170 | 2018-04-12,1031.469971,1044.650024,1026.050049,1037.290039,1037.290039,1644800 171 | 2018-04-13,1046.890015,1052.979980,1030.150024,1036.040039,1036.040039,1270500 172 | 2018-04-16,1045.550049,1051.430054,1033.920044,1046.099976,1046.099976,1488800 173 | 2018-04-17,1061.199951,1085.000000,1057.089966,1079.359985,1079.359985,2729200 174 | 2018-04-18,1079.010010,1082.000000,1070.520020,1075.390015,1075.390015,1556300 175 | 2018-04-19,1069.020020,1097.510010,1069.020020,1089.449951,1089.449951,1994200 176 | 2018-04-20,1084.270020,1094.750000,1072.099976,1077.319946,1077.319946,2121700 177 | 2018-04-23,1082.979980,1088.000000,1066.680054,1073.810059,1073.810059,3479500 178 | 2018-04-24,1059.199951,1064.489990,1012.859985,1022.640015,1022.640015,6411000 179 | 2018-04-25,1029.750000,1036.069946,1017.010010,1022.989990,1022.989990,2893000 180 | 2018-04-26,1033.219971,1052.020020,1020.450012,1043.310059,1043.310059,2546300 181 | 2018-04-27,1045.540039,1051.699951,1027.589966,1031.449951,1031.449951,2037300 182 | 2018-04-30,1034.420044,1038.369995,1018.299988,1018.580017,1018.580017,1724600 183 | 2018-05-01,1016.299988,1041.729980,1010.609985,1040.750000,1040.750000,1766300 184 | 2018-05-02,1034.000000,1043.979980,1023.159973,1026.050049,1026.050049,1734900 185 | 2018-05-03,1025.369995,1030.689941,1007.890015,1026.300049,1026.300049,1964100 186 | 2018-05-04,1019.609985,1051.880005,1018.049988,1051.000000,1051.000000,1844600 187 | 2018-05-07,1053.890015,1065.000000,1050.270020,1059.459961,1059.459961,1720000 188 | 2018-05-08,1064.619995,1065.229980,1051.640015,1058.589966,1058.589966,1301500 189 | 2018-05-09,1064.099976,1094.000000,1062.109985,1088.949951,1088.949951,2358000 190 | 2018-05-10,1095.000000,1109.410034,1093.880005,1105.469971,1105.469971,1820700 191 | 2018-05-11,1100.410034,1109.010010,1097.219971,1103.380005,1103.380005,1525200 192 | 2018-05-14,1105.569946,1118.150024,1104.800049,1106.599976,1106.599976,1966900 193 | 2018-05-15,1096.900024,1099.119995,1078.780029,1084.869995,1084.869995,1786900 194 | 2018-05-16,1085.089966,1094.380005,1081.630005,1084.089966,1084.089966,1281400 195 | 2018-05-17,1081.459961,1091.000000,1076.420044,1081.260010,1081.260010,1286900 196 | 2018-05-18,1066.000000,1073.729980,1064.680054,1069.640015,1069.640015,1774100 197 | 2018-05-21,1079.000000,1093.300049,1078.000000,1084.010010,1084.010010,1259000 198 | 2018-05-22,1089.800049,1091.800049,1072.260010,1075.310059,1075.310059,1111300 199 | 2018-05-23,1070.000000,1088.000000,1066.959961,1085.959961,1085.959961,1154800 200 | 2018-05-24,1086.900024,1087.119995,1072.300049,1085.449951,1085.449951,1023200 201 | 2018-05-25,1086.550049,1089.569946,1082.599976,1084.079956,1084.079956,1111200 202 | 2018-05-29,1076.000000,1081.339966,1063.079956,1068.069946,1068.069946,1793600 203 | 2018-05-30,1073.479980,1078.989990,1066.550049,1077.469971,1077.469971,1434300 204 | 2018-05-31,1082.000000,1110.000000,1078.000000,1100.000000,1100.000000,3968400 205 | 2018-06-01,1112.869995,1138.160034,1112.010010,1135.000000,1135.000000,3150700 206 | 2018-06-04,1138.500000,1157.859985,1137.000000,1153.040039,1153.040039,2233600 207 | 2018-06-05,1154.660034,1161.099976,1147.459961,1151.020020,1151.020020,1648200 208 | 2018-06-06,1152.770020,1154.709961,1136.319946,1146.949951,1146.949951,1746700 209 | 2018-06-07,1144.579956,1145.869995,1126.119995,1134.420044,1134.420044,1805400 210 | 2018-06-08,1131.209961,1138.780029,1123.229980,1132.709961,1132.709961,1364200 211 | 2018-06-11,1132.939941,1147.739990,1131.400024,1140.900024,1140.900024,1239800 212 | 2018-06-12,1141.020020,1148.750000,1141.020020,1148.189941,1148.189941,1304600 213 | 2018-06-13,1152.280029,1155.640015,1143.380005,1144.229980,1144.229980,1715100 214 | 2018-06-14,1152.209961,1165.989990,1150.599976,1160.109985,1160.109985,1771100 215 | 2018-06-15,1159.920044,1163.910034,1153.689941,1159.270020,1159.270020,2221900 216 | 2018-06-18,1152.689941,1184.130005,1151.000000,1183.579956,1183.579956,1651900 217 | 2018-06-19,1170.109985,1182.810059,1161.609985,1178.689941,1178.689941,2364100 218 | 2018-06-20,1183.300049,1201.489990,1182.030029,1184.069946,1184.069946,2584300 219 | 2018-06-21,1185.510010,1190.329956,1163.479980,1169.439941,1169.439941,2248300 220 | 2018-06-22,1171.489990,1175.000000,1159.650024,1169.290039,1169.290039,1711000 221 | 2018-06-25,1155.000000,1155.989990,1119.900024,1139.280029,1139.280029,2884100 222 | 2018-06-26,1144.140015,1146.869995,1129.000000,1132.619995,1132.619995,1734400 223 | 2018-06-27,1136.000000,1146.209961,1116.699951,1116.939941,1116.939941,1726900 224 | 2018-06-28,1112.390015,1134.000000,1106.069946,1126.780029,1126.780029,1486300 225 | 2018-06-29,1132.310059,1141.359985,1127.020020,1129.189941,1129.189941,1578100 226 | 2018-07-02,1115.349976,1142.989990,1106.599976,1142.109985,1142.109985,1160800 227 | 2018-07-03,1149.420044,1149.910034,1114.430054,1116.280029,1116.280029,822400 228 | 2018-07-05,1124.599976,1144.140015,1123.119995,1141.290039,1141.290039,1429700 229 | 2018-07-06,1141.770020,1156.199951,1137.239990,1155.079956,1155.079956,1091000 230 | 2018-07-09,1160.000000,1167.930054,1157.229980,1167.280029,1167.280029,1079200 231 | 2018-07-10,1169.989990,1173.500000,1162.560059,1167.140015,1167.140015,1066700 232 | 2018-07-11,1155.619995,1180.439941,1155.369995,1171.459961,1171.459961,1662600 233 | 2018-07-12,1174.859985,1201.989990,1173.099976,1201.260010,1201.260010,2207400 234 | 2018-07-13,1202.800049,1210.439941,1195.290039,1204.420044,1204.420044,1630600 235 | 2018-07-16,1203.810059,1208.709961,1193.400024,1196.510010,1196.510010,1339200 236 | 2018-07-17,1182.739990,1218.760010,1182.000000,1213.079956,1213.079956,2008100 237 | 2018-07-18,1208.530029,1221.589966,1204.560059,1212.910034,1212.910034,1947400 238 | 2018-07-19,1206.650024,1216.479980,1197.729980,1199.099976,1199.099976,1916900 239 | 2018-07-20,1199.239990,1210.770020,1196.589966,1197.880005,1197.880005,1896900 240 | 2018-07-23,1195.660034,1215.099976,1192.010010,1211.000000,1211.000000,3272300 241 | 2018-07-24,1271.000000,1275.000000,1244.140015,1258.150024,1258.150024,5380000 242 | 2018-07-25,1252.619995,1278.239990,1249.050049,1275.939941,1275.939941,2555200 243 | 2018-07-26,1267.180054,1287.400024,1263.000000,1285.500000,1285.500000,2734300 244 | 2018-07-27,1289.119995,1291.439941,1244.489990,1252.890015,1252.890015,2418100 245 | 2018-07-30,1245.050049,1252.890015,1224.170044,1230.040039,1230.040039,2194800 246 | 2018-07-31,1231.709961,1241.209961,1216.189941,1227.219971,1227.219971,1969100 247 | 2018-08-01,1239.109985,1245.900024,1224.939941,1232.989990,1232.989990,1849700 248 | 2018-08-02,1218.500000,1244.410034,1218.060059,1241.130005,1241.130005,1735200 249 | 2018-08-03,1245.180054,1246.520020,1229.420044,1238.160034,1238.160034,1063200 250 | 2018-08-06,1241.609985,1242.459961,1230.530029,1237.670044,1237.670044,1105700 251 | 2018-08-07,1252.010010,1266.079956,1251.800049,1255.839966,1255.839966,2125300 252 | 2018-08-08,1256.719971,1271.719971,1252.119995,1261.329956,1261.329956,1717200 253 | 2018-08-09,1262.729980,1271.959961,1260.099976,1264.459961,1264.459961,1365700 254 | 2018-08-10,1259.180054,1261.199951,1247.160034,1252.510010,1252.510010,1330100 -------------------------------------------------------------------------------- /data/GOOG_2019.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Adj Close,Volume 2 | 2019-01-02,1016.570007,1052.319946,1015.710022,1045.849976,1045.849976,1532600 3 | 2019-01-03,1041.000000,1056.979980,1014.070007,1016.059998,1016.059998,1841100 4 | 2019-01-04,1032.589966,1070.839966,1027.417969,1070.709961,1070.709961,2093900 5 | 2019-01-07,1071.500000,1074.000000,1054.760010,1068.390015,1068.390015,1981900 6 | 2019-01-08,1076.109985,1084.560059,1060.530029,1076.280029,1076.280029,1764900 7 | 2019-01-09,1081.650024,1082.630005,1066.400024,1074.660034,1074.660034,1199300 8 | 2019-01-10,1067.660034,1071.150024,1057.709961,1070.329956,1070.329956,1456400 9 | 2019-01-11,1063.180054,1063.775024,1048.479980,1057.189941,1057.189941,1520800 10 | 2019-01-14,1046.920044,1051.530029,1041.255005,1044.689941,1044.689941,1144300 11 | 2019-01-15,1050.170044,1080.050049,1047.339966,1077.150024,1077.150024,1463600 12 | 2019-01-16,1080.000000,1092.375000,1079.339966,1080.969971,1080.969971,1331800 13 | 2019-01-17,1079.469971,1091.800049,1073.500000,1089.900024,1089.900024,1242700 14 | 2019-01-18,1100.000000,1108.352051,1090.900024,1098.260010,1098.260010,1955600 15 | 2019-01-22,1088.000000,1091.510010,1063.469971,1070.520020,1070.520020,1613500 16 | 2019-01-23,1077.349976,1084.930054,1059.750000,1075.569946,1075.569946,967000 17 | 2019-01-24,1076.479980,1079.474976,1060.699951,1073.900024,1073.900024,1361300 18 | 2019-01-25,1085.000000,1094.000000,1081.819946,1090.989990,1090.989990,1119100 19 | 2019-01-28,1080.109985,1083.000000,1063.800049,1070.079956,1070.079956,1284300 20 | 2019-01-29,1072.680054,1075.150024,1055.864990,1060.619995,1060.619995,1021800 21 | 2019-01-30,1068.430054,1091.000000,1066.849976,1089.060059,1089.060059,1279800 22 | 2019-01-31,1103.000000,1117.329956,1095.410034,1116.369995,1116.369995,1538300 23 | 2019-02-01,1112.400024,1125.000000,1104.890015,1110.750000,1110.750000,1462200 24 | 2019-02-04,1112.660034,1132.800049,1109.020020,1132.800049,1132.800049,2576500 25 | 2019-02-05,1124.839966,1146.849976,1117.248047,1145.989990,1145.989990,3552200 26 | 2019-02-06,1139.569946,1147.000000,1112.770020,1115.229980,1115.229980,2105600 27 | 2019-02-07,1104.160034,1104.839966,1086.000000,1098.709961,1098.709961,2044800 28 | 2019-02-08,1087.000000,1098.910034,1086.550049,1095.060059,1095.060059,1075800 29 | 2019-02-11,1096.949951,1105.944946,1092.859985,1095.010010,1095.010010,1065200 30 | 2019-02-12,1106.800049,1125.295044,1105.849976,1121.369995,1121.369995,1609100 31 | 2019-02-13,1124.989990,1134.729980,1118.500000,1120.160034,1120.160034,1049800 32 | 2019-02-14,1118.050049,1128.229980,1110.444946,1121.670044,1121.670044,947600 33 | 2019-02-15,1130.079956,1131.670044,1110.650024,1113.650024,1113.650024,1449800 34 | 2019-02-19,1110.000000,1121.890015,1110.000000,1118.560059,1118.560059,1046400 35 | 2019-02-20,1119.989990,1123.410034,1105.280029,1113.800049,1113.800049,1087800 36 | 2019-02-21,1110.839966,1111.939941,1092.520020,1096.969971,1096.969971,1415100 37 | 2019-02-22,1100.900024,1111.239990,1095.599976,1110.369995,1110.369995,1049500 38 | 2019-02-25,1116.000000,1118.540039,1107.270020,1109.400024,1109.400024,1413100 39 | 2019-02-26,1105.750000,1119.510010,1099.920044,1115.130005,1115.130005,1471300 40 | 2019-02-27,1106.949951,1117.979980,1101.000000,1116.050049,1116.050049,968400 41 | 2019-02-28,1111.300049,1127.650024,1111.010010,1119.920044,1119.920044,1542500 42 | 2019-03-01,1124.900024,1142.969971,1124.750000,1140.989990,1140.989990,1450300 43 | 2019-03-04,1146.989990,1158.280029,1130.689941,1147.800049,1147.800049,1446000 44 | 2019-03-05,1150.060059,1169.609985,1146.194946,1162.030029,1162.030029,1443200 45 | 2019-03-06,1162.489990,1167.566040,1155.489990,1157.859985,1157.859985,1099300 46 | 2019-03-07,1155.719971,1156.755005,1134.910034,1143.300049,1143.300049,1166600 47 | 2019-03-08,1126.729980,1147.079956,1123.300049,1142.319946,1142.319946,1212400 48 | 2019-03-11,1144.449951,1176.189941,1144.449951,1175.760010,1175.760010,1719200 49 | 2019-03-12,1178.260010,1200.000000,1178.260010,1193.199951,1193.199951,2013100 50 | 2019-03-13,1200.645020,1200.930054,1191.939941,1193.319946,1193.319946,1435900 51 | 2019-03-14,1194.510010,1197.880005,1184.479980,1185.550049,1185.550049,1172800 52 | 2019-03-15,1193.380005,1196.569946,1182.609985,1184.459961,1184.459961,2461800 53 | 2019-03-18,1183.300049,1190.000000,1177.421021,1184.260010,1184.260010,1292600 54 | 2019-03-19,1188.810059,1200.000000,1185.869995,1198.849976,1198.849976,1520700 55 | 2019-03-20,1197.349976,1227.140015,1196.170044,1223.969971,1223.969971,2227400 56 | 2019-03-21,1216.000000,1231.790039,1213.150024,1231.540039,1231.540039,1204000 57 | 2019-03-22,1226.319946,1230.000000,1202.824951,1205.500000,1205.500000,1714200 58 | 2019-03-25,1196.930054,1206.397949,1187.040039,1193.000000,1193.000000,1496800 59 | 2019-03-26,1198.530029,1202.829956,1176.719971,1184.619995,1184.619995,1901200 60 | 2019-03-27,1185.500000,1187.558960,1159.369995,1173.020020,1173.020020,1400200 61 | 2019-03-28,1171.540039,1171.564941,1159.431030,1168.489990,1168.489990,1012400 62 | 2019-03-29,1174.900024,1178.989990,1162.880005,1173.310059,1173.310059,1269900 63 | 2019-04-01,1184.099976,1196.660034,1182.000000,1194.430054,1194.430054,1252500 64 | 2019-04-02,1195.319946,1201.349976,1185.709961,1200.489990,1200.489990,827900 65 | 2019-04-03,1207.479980,1216.300049,1200.500000,1205.920044,1205.920044,1017800 66 | 2019-04-04,1205.939941,1215.670044,1204.130005,1215.000000,1215.000000,950000 67 | 2019-04-05,1214.989990,1216.219971,1205.030029,1207.150024,1207.150024,907200 68 | 2019-04-08,1207.890015,1208.689941,1199.859985,1203.839966,1203.839966,860200 69 | 2019-04-09,1196.000000,1202.290039,1193.079956,1197.250000,1197.250000,876400 70 | 2019-04-10,1200.680054,1203.785034,1196.435059,1202.160034,1202.160034,724600 71 | 2019-04-11,1203.959961,1207.959961,1200.130005,1204.619995,1204.619995,710200 72 | 2019-04-12,1210.000000,1218.349976,1208.109985,1217.869995,1217.869995,933400 73 | 2019-04-15,1218.000000,1224.199951,1209.109985,1221.099976,1221.099976,1187400 74 | 2019-04-16,1225.000000,1230.819946,1220.119995,1227.130005,1227.130005,856300 75 | 2019-04-17,1233.000000,1240.560059,1227.819946,1236.339966,1236.339966,1221900 76 | 2019-04-18,1239.180054,1242.000000,1234.609985,1236.369995,1236.369995,1331800 77 | 2019-04-22,1235.989990,1249.089966,1228.310059,1248.839966,1248.839966,807300 78 | 2019-04-23,1250.689941,1269.000000,1246.380005,1264.550049,1264.550049,1319900 79 | 2019-04-24,1264.119995,1268.010010,1255.000000,1256.000000,1256.000000,1018800 80 | 2019-04-25,1264.770020,1267.407959,1252.030029,1263.449951,1263.449951,1107300 81 | 2019-04-26,1269.000000,1273.069946,1260.319946,1272.180054,1272.180054,1241400 82 | 2019-04-29,1274.000000,1289.270020,1266.295044,1287.579956,1287.579956,2499400 83 | 2019-04-30,1185.000000,1192.810059,1175.000000,1188.479980,1188.479980,6207000 84 | 2019-05-01,1188.050049,1188.050049,1167.180054,1168.079956,1168.079956,2639200 85 | 2019-05-02,1167.760010,1174.189941,1155.001953,1162.609985,1162.609985,1944800 86 | 2019-05-03,1173.650024,1186.800049,1169.000000,1185.400024,1185.400024,1980700 87 | 2019-05-06,1166.260010,1190.849976,1166.260010,1189.390015,1189.390015,1563900 88 | 2019-05-07,1180.469971,1190.439941,1161.040039,1174.099976,1174.099976,1551400 89 | 2019-05-08,1172.010010,1180.423950,1165.739990,1166.270020,1166.270020,1309300 90 | 2019-05-09,1159.030029,1169.660034,1150.849976,1162.380005,1162.380005,1185700 91 | 2019-05-10,1163.589966,1172.599976,1142.500000,1164.270020,1164.270020,1314500 92 | 2019-05-13,1141.959961,1147.939941,1122.109985,1132.030029,1132.030029,1860600 93 | 2019-05-14,1137.209961,1140.420044,1119.550049,1120.439941,1120.439941,1836600 94 | 2019-05-15,1117.869995,1171.329956,1116.666016,1164.209961,1164.209961,2289300 95 | 2019-05-16,1164.510010,1188.160034,1162.839966,1178.979980,1178.979980,1531400 96 | 2019-05-17,1168.469971,1180.150024,1160.010010,1162.300049,1162.300049,1208600 97 | 2019-05-20,1144.500000,1146.796997,1131.442993,1138.849976,1138.849976,1353300 98 | 2019-05-21,1148.489990,1152.708008,1137.939941,1149.630005,1149.630005,1159800 99 | 2019-05-22,1146.750000,1158.520020,1145.890015,1151.420044,1151.420044,914500 100 | 2019-05-23,1140.500000,1145.973022,1129.223999,1140.770020,1140.770020,1198900 101 | 2019-05-24,1147.359985,1149.765015,1131.660034,1133.469971,1133.469971,1112000 102 | 2019-05-28,1134.000000,1151.587036,1133.119995,1134.150024,1134.150024,1365000 103 | 2019-05-29,1127.520020,1129.099976,1108.219971,1116.459961,1116.459961,1538200 104 | 2019-05-30,1115.540039,1123.130005,1112.119995,1117.949951,1117.949951,951900 105 | 2019-05-31,1101.290039,1109.599976,1100.180054,1103.630005,1103.630005,1507800 106 | 2019-06-03,1065.500000,1065.500000,1025.000000,1036.229980,1036.229980,5130600 107 | 2019-06-04,1042.900024,1056.050049,1033.689941,1053.050049,1053.050049,2833500 108 | 2019-06-05,1051.540039,1053.550049,1030.489990,1042.219971,1042.219971,2168400 109 | 2019-06-06,1044.989990,1047.489990,1033.699951,1044.339966,1044.339966,1703200 110 | 2019-06-07,1050.630005,1070.920044,1048.400024,1066.040039,1066.040039,1802400 111 | 2019-06-10,1072.979980,1092.660034,1072.322021,1080.380005,1080.380005,1464200 112 | 2019-06-11,1093.979980,1101.989990,1077.603027,1078.719971,1078.719971,1436700 113 | 2019-06-12,1078.000000,1080.930054,1067.540039,1077.030029,1077.030029,1061000 114 | 2019-06-13,1083.640015,1094.170044,1080.150024,1088.770020,1088.770020,1057700 115 | 2019-06-14,1086.420044,1092.689941,1080.171997,1085.349976,1085.349976,1111500 116 | 2019-06-17,1086.280029,1099.180054,1086.280029,1092.500000,1092.500000,941600 117 | 2019-06-18,1109.689941,1116.390015,1098.989990,1103.599976,1103.599976,1386700 118 | 2019-06-19,1105.599976,1107.000000,1093.479980,1102.329956,1102.329956,1338800 119 | 2019-06-20,1119.989990,1120.119995,1104.739990,1111.420044,1111.420044,1262000 120 | 2019-06-21,1109.239990,1124.109985,1108.079956,1121.880005,1121.880005,1947600 121 | 2019-06-24,1119.609985,1122.000000,1111.010010,1115.520020,1115.520020,1395600 122 | 2019-06-25,1112.660034,1114.349976,1083.800049,1086.349976,1086.349976,1546900 123 | 2019-06-26,1086.500000,1092.969971,1072.239990,1079.800049,1079.800049,1810900 124 | 2019-06-27,1084.000000,1087.099976,1075.290039,1076.010010,1076.010010,1004300 125 | 2019-06-28,1076.390015,1081.000000,1073.369995,1080.910034,1080.910034,1693200 126 | 2019-07-01,1098.000000,1107.579956,1093.703003,1097.949951,1097.949951,1436300 127 | 2019-07-02,1102.239990,1111.770020,1098.170044,1111.250000,1111.250000,991600 128 | 2019-07-03,1117.410034,1126.760010,1113.859985,1121.579956,1121.579956,767000 129 | 2019-07-05,1117.800049,1132.880005,1116.140015,1131.589966,1131.589966,1264300 130 | 2019-07-08,1125.170044,1125.979980,1111.209961,1116.349976,1116.349976,1236400 131 | 2019-07-09,1111.800049,1128.025024,1107.170044,1124.829956,1124.829956,1330400 132 | 2019-07-10,1131.219971,1142.050049,1130.969971,1140.479980,1140.479980,1208800 133 | 2019-07-11,1143.250000,1153.069946,1139.579956,1144.209961,1144.209961,1195500 134 | 2019-07-12,1143.989990,1147.339966,1138.780029,1144.900024,1144.900024,864000 135 | 2019-07-15,1146.859985,1150.819946,1139.400024,1150.339966,1150.339966,903800 136 | 2019-07-16,1146.000000,1158.579956,1145.000000,1153.579956,1153.579956,1238800 137 | 2019-07-17,1150.969971,1158.359985,1145.770020,1146.349976,1146.349976,1170000 138 | 2019-07-18,1141.739990,1147.604980,1132.729980,1146.329956,1146.329956,1291300 139 | 2019-07-19,1148.189941,1151.140015,1129.619995,1130.099976,1130.099976,1647200 140 | 2019-07-22,1133.449951,1139.250000,1124.239990,1138.069946,1138.069946,1301500 141 | 2019-07-23,1144.000000,1146.900024,1131.800049,1146.209961,1146.209961,1093700 142 | 2019-07-24,1131.900024,1144.000000,1126.989990,1137.810059,1137.810059,1589800 143 | 2019-07-25,1137.819946,1141.699951,1120.920044,1132.119995,1132.119995,2209800 144 | 2019-07-26,1224.040039,1265.550049,1224.000000,1250.410034,1250.410034,4805800 145 | 2019-07-29,1241.050049,1247.369995,1228.229980,1239.410034,1239.410034,2223700 146 | 2019-07-30,1225.410034,1234.869995,1223.300049,1225.140015,1225.140015,1453300 147 | 2019-07-31,1223.000000,1234.000000,1207.764038,1216.680054,1216.680054,1725500 148 | 2019-08-01,1214.030029,1234.109985,1205.719971,1209.010010,1209.010010,1698500 149 | 2019-08-02,1200.739990,1206.900024,1188.939941,1193.989990,1193.989990,1645100 150 | 2019-08-05,1170.040039,1175.239990,1140.140015,1152.319946,1152.319946,2597500 151 | 2019-08-06,1163.310059,1179.959961,1160.000000,1169.949951,1169.949951,1709400 152 | 2019-08-07,1156.000000,1178.444946,1149.624023,1173.989990,1173.989990,1444300 153 | 2019-08-08,1182.829956,1205.010010,1173.020020,1204.800049,1204.800049,1468000 154 | 2019-08-09,1197.989990,1203.880005,1183.603027,1188.010010,1188.010010,1065700 155 | 2019-08-12,1179.209961,1184.959961,1167.671997,1174.709961,1174.709961,1003000 156 | 2019-08-13,1171.459961,1204.780029,1171.459961,1197.270020,1197.270020,1294400 157 | 2019-08-14,1176.310059,1182.300049,1160.540039,1164.290039,1164.290039,1578700 158 | 2019-08-15,1163.500000,1175.839966,1162.109985,1167.260010,1167.260010,1218700 159 | 2019-08-16,1179.550049,1182.719971,1171.810059,1177.599976,1177.599976,1313300 160 | 2019-08-19,1190.089966,1206.989990,1190.089966,1198.449951,1198.449951,1231600 161 | 2019-08-20,1195.250000,1196.060059,1182.109985,1182.689941,1182.689941,915500 162 | 2019-08-21,1193.150024,1199.000000,1187.430054,1191.250000,1191.250000,740700 163 | 2019-08-22,1194.069946,1198.011963,1178.579956,1189.530029,1189.530029,947500 164 | 2019-08-23,1181.989990,1194.079956,1147.750000,1151.290039,1151.290039,1687000 165 | 2019-08-26,1157.260010,1169.469971,1152.959961,1168.890015,1168.890015,1226100 166 | 2019-08-27,1180.530029,1182.400024,1161.449951,1167.839966,1167.839966,1077200 167 | 2019-08-28,1161.709961,1176.420044,1157.300049,1171.020020,1171.020020,802000 168 | 2019-08-29,1181.119995,1196.060059,1181.119995,1192.849976,1192.849976,1088400 169 | 2019-08-30,1198.500000,1198.500000,1183.802979,1188.099976,1188.099976,1129800 170 | 2019-09-03,1177.030029,1186.890015,1163.199951,1168.390015,1168.390015,1479900 171 | 2019-09-04,1176.709961,1183.479980,1171.000000,1181.410034,1181.410034,1068900 172 | 2019-09-05,1191.530029,1213.040039,1191.530029,1211.380005,1211.380005,1408100 173 | 2019-09-06,1208.130005,1212.015015,1202.521973,1204.930054,1204.930054,1072100 174 | 2019-09-09,1204.000000,1220.000000,1192.619995,1204.410034,1204.410034,1471900 175 | 2019-09-10,1195.150024,1210.000000,1194.579956,1206.000000,1206.000000,1260100 176 | 2019-09-11,1203.410034,1222.599976,1202.199951,1220.170044,1220.170044,1307000 177 | 2019-09-12,1224.300049,1241.859985,1223.020020,1234.250000,1234.250000,1725900 178 | 2019-09-13,1231.349976,1240.880005,1227.010010,1239.560059,1239.560059,1301400 179 | 2019-09-16,1229.520020,1239.560059,1225.609985,1231.300049,1231.300049,1053300 180 | 2019-09-17,1230.400024,1235.000000,1223.689941,1229.150024,1229.150024,955100 181 | 2019-09-18,1227.510010,1235.609985,1216.530029,1232.410034,1232.410034,1135100 182 | 2019-09-19,1232.060059,1244.439941,1232.020020,1238.709961,1238.709961,996000 183 | 2019-09-20,1233.119995,1243.319946,1223.079956,1229.930054,1229.930054,2270000 184 | 2019-09-23,1226.000000,1239.089966,1224.170044,1234.030029,1234.030029,1062400 185 | 2019-09-24,1240.000000,1246.739990,1210.680054,1218.760010,1218.760010,1583200 186 | 2019-09-25,1215.819946,1248.300049,1210.089966,1246.520020,1246.520020,1453000 187 | 2019-09-26,1241.959961,1245.000000,1232.267944,1241.390015,1241.390015,1538000 188 | 2019-09-27,1243.010010,1244.020020,1214.449951,1225.089966,1225.089966,1353900 189 | 2019-09-30,1220.969971,1226.000000,1212.300049,1219.000000,1219.000000,1404100 190 | 2019-10-01,1219.000000,1231.229980,1203.579956,1205.099976,1205.099976,1273500 191 | 2019-10-02,1196.979980,1196.979980,1171.290039,1176.630005,1176.630005,1615100 192 | 2019-10-03,1180.000000,1189.060059,1162.430054,1187.829956,1187.829956,1621200 193 | 2019-10-04,1191.890015,1211.439941,1189.170044,1209.000000,1209.000000,1162400 194 | 2019-10-07,1204.400024,1218.203979,1203.750000,1207.680054,1207.680054,842900 195 | 2019-10-08,1197.589966,1206.079956,1189.010010,1189.130005,1189.130005,1039300 196 | 2019-10-09,1199.349976,1208.349976,1197.630005,1202.310059,1202.310059,867700 197 | 2019-10-10,1198.579956,1215.000000,1197.339966,1208.670044,1208.670044,846600 198 | 2019-10-11,1222.209961,1228.390015,1213.739990,1215.449951,1215.449951,1272700 199 | 2019-10-14,1212.339966,1226.329956,1211.760010,1217.140015,1217.140015,867500 200 | 2019-10-15,1220.400024,1247.329956,1220.400024,1243.010010,1243.010010,1381700 201 | 2019-10-16,1241.170044,1254.739990,1238.449951,1243.640015,1243.640015,1094600 202 | 2019-10-17,1250.930054,1263.324951,1249.939941,1253.069946,1253.069946,952400 203 | 2019-10-18,1253.459961,1258.890015,1241.079956,1245.489990,1245.489990,1352800 204 | 2019-10-21,1252.260010,1254.629028,1240.599976,1246.150024,1246.150024,1027200 205 | 2019-10-22,1247.849976,1250.599976,1241.380005,1242.800049,1242.800049,1023800 206 | 2019-10-23,1242.359985,1259.890015,1242.359985,1259.130005,1259.130005,911500 207 | 2019-10-24,1260.900024,1264.000000,1253.714966,1260.989990,1260.989990,1028100 208 | 2019-10-25,1251.030029,1269.599976,1250.010010,1265.130005,1265.130005,1213100 209 | 2019-10-28,1275.449951,1299.310059,1272.540039,1290.000000,1290.000000,2613200 210 | 2019-10-29,1276.229980,1281.589966,1257.212036,1262.619995,1262.619995,1886400 211 | 2019-10-30,1252.969971,1269.359985,1252.000000,1261.290039,1261.290039,1408900 212 | 2019-10-31,1261.280029,1267.670044,1250.843018,1260.109985,1260.109985,1455700 213 | 2019-11-01,1265.000000,1274.619995,1260.500000,1273.739990,1273.739990,1670100 214 | 2019-11-04,1276.449951,1294.130005,1276.354980,1291.369995,1291.369995,1501000 215 | 2019-11-05,1292.890015,1298.930054,1291.229004,1292.030029,1292.030029,1282700 216 | 2019-11-06,1289.459961,1293.729980,1282.500000,1291.800049,1291.800049,1152700 217 | 2019-11-07,1294.280029,1323.739990,1294.244995,1308.859985,1308.859985,2030000 218 | 2019-11-08,1305.280029,1318.000000,1304.364990,1311.369995,1311.369995,1251400 219 | 2019-11-11,1303.180054,1306.425049,1297.410034,1299.189941,1299.189941,1011900 220 | 2019-11-12,1300.000000,1310.000000,1295.770020,1298.800049,1298.800049,1085900 221 | 2019-11-13,1294.069946,1304.300049,1293.510010,1298.000000,1298.000000,826700 222 | 2019-11-14,1297.500000,1317.000000,1295.650024,1311.459961,1311.459961,1193500 223 | 2019-11-15,1318.939941,1334.880005,1314.280029,1334.869995,1334.869995,1782600 224 | 2019-11-18,1332.219971,1335.529053,1317.500000,1320.699951,1320.699951,1487400 225 | 2019-11-19,1327.699951,1327.699951,1312.800049,1315.459961,1315.459961,1269200 226 | 2019-11-20,1311.739990,1315.000000,1291.150024,1303.050049,1303.050049,1308600 227 | 2019-11-21,1301.479980,1312.589966,1293.000000,1301.349976,1301.349976,995500 228 | 2019-11-22,1305.619995,1308.729980,1291.410034,1295.339966,1295.339966,1385700 229 | 2019-11-25,1299.180054,1311.310059,1298.130005,1306.689941,1306.689941,1036200 230 | 2019-11-26,1309.859985,1314.800049,1305.089966,1313.550049,1313.550049,1069700 231 | 2019-11-27,1315.000000,1318.359985,1309.630005,1312.989990,1312.989990,995600 232 | 2019-11-29,1307.119995,1310.204956,1303.969971,1304.959961,1304.959961,587000 233 | 2019-12-02,1301.000000,1305.829956,1281.000000,1289.920044,1289.920044,1510900 234 | 2019-12-03,1279.569946,1298.461060,1279.000000,1295.280029,1295.280029,1143800 235 | 2019-12-04,1307.010010,1325.800049,1304.869995,1320.540039,1320.540039,1537500 236 | 2019-12-05,1328.000000,1329.358032,1316.439941,1328.130005,1328.130005,1212700 237 | 2019-12-06,1333.439941,1344.000000,1333.439941,1340.619995,1340.619995,1314800 238 | 2019-12-09,1338.040039,1359.449951,1337.839966,1343.560059,1343.560059,1354300 239 | 2019-12-10,1341.500000,1349.974976,1336.040039,1344.660034,1344.660034,1094100 240 | 2019-12-11,1350.839966,1351.199951,1342.670044,1345.020020,1345.020020,850400 241 | 2019-12-12,1345.939941,1355.775024,1340.500000,1350.270020,1350.270020,1281000 242 | 2019-12-13,1347.949951,1353.093018,1343.869995,1347.829956,1347.829956,1549600 243 | 2019-12-16,1356.500000,1364.680054,1352.670044,1361.170044,1361.170044,1397300 244 | 2019-12-17,1362.890015,1365.000000,1351.322998,1355.119995,1355.119995,1854000 245 | 2019-12-18,1356.599976,1360.469971,1351.000000,1352.619995,1352.619995,1522600 246 | 2019-12-19,1351.819946,1358.099976,1348.984985,1356.040039,1356.040039,1469900 247 | 2019-12-20,1363.349976,1363.640015,1349.000000,1349.589966,1349.589966,3315000 248 | 2019-12-23,1355.869995,1359.800049,1346.510010,1348.839966,1348.839966,883100 249 | 2019-12-24,1348.500000,1350.260010,1342.780029,1343.560059,1343.560059,347500 250 | 2019-12-26,1346.170044,1361.327026,1344.469971,1360.400024,1360.400024,667500 251 | 2019-12-27,1362.989990,1364.530029,1349.310059,1351.890015,1351.890015,1038400 252 | 2019-12-30,1350.000000,1353.000000,1334.020020,1336.140015,1336.140015,1050900 253 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: deepRLTrader 2 | channels: 3 | - conda-forge 4 | - defaults 5 | dependencies: 6 | - _tflow_select=2.3.0=mkl 7 | - absl-py=0.8.1=py37_0 8 | - astor=0.8.0=py37_0 9 | - attrs=19.3.0=py_0 10 | - backcall=0.1.0=py_0 11 | - blas=1.0=mkl 12 | - bleach=3.1.0=py_0 13 | - c-ares=1.15.0=h1de35cc_1001 14 | - ca-certificates=2019.11.28=hecc5488_0 15 | - certifi=2019.11.28=py37_0 16 | - decorator=4.4.1=py_0 17 | - defusedxml=0.6.0=py_0 18 | - entrypoints=0.3=py37_1000 19 | - gast=0.2.2=py37_0 20 | - google-pasta=0.1.8=py_0 21 | - grpcio=1.16.1=py37h044775b_1 22 | - h5py=2.9.0=py37h3134771_0 23 | - hdf5=1.10.4=hfa1e0ec_0 24 | - importlib_metadata=1.5.0=py37_0 25 | - inflect=4.0.0=py37_1 26 | - intel-openmp=2019.4=233 27 | - ipykernel=5.1.4=py37h5ca1d4c_0 28 | - ipython=7.11.1=py37h5ca1d4c_0 29 | - ipython_genutils=0.2.0=py_1 30 | - jaraco.itertools=5.0.0=py_0 31 | - jedi=0.16.0=py37_0 32 | - jsonschema=3.2.0=py37_0 33 | - jupyter_client=5.3.4=py37_1 34 | - jupyter_core=4.6.1=py37_0 35 | - keras-applications=1.0.8=py_0 36 | - keras-preprocessing=1.1.0=py_1 37 | - libcxx=4.0.1=hcfea43d_1 38 | - libcxxabi=4.0.1=hcfea43d_1 39 | - libedit=3.1.20181209=hb402a30_0 40 | - libffi=3.2.1=h475c297_4 41 | - libgfortran=3.0.1=h93005f0_2 42 | - libprotobuf=3.11.2=hd9629dc_0 43 | - libsodium=1.0.17=h01d97ff_0 44 | - markdown=3.1.1=py37_0 45 | - markupsafe=1.1.1=py37h0b31af3_0 46 | - mistune=0.8.4=py37h0b31af3_1000 47 | - mkl=2019.4=233 48 | - mkl-service=2.3.0=py37hfbe908c_0 49 | - mkl_fft=1.0.15=py37h5e564d8_0 50 | - mkl_random=1.1.0=py37ha771720_0 51 | - more-itertools=8.2.0=py_0 52 | - nbconvert=5.6.1=py37_0 53 | - nbformat=5.0.4=py_0 54 | - ncurses=6.1=h0a44026_1 55 | - notebook=6.0.3=py37_0 56 | - numpy=1.18.1=py37h7241aed_0 57 | - numpy-base=1.18.1=py37h6575580_1 58 | - openssl=1.1.1d=h0b31af3_0 59 | - opt_einsum=3.1.0=py_0 60 | - pandoc=2.9.1.1=0 61 | - parso=0.6.0=py_0 62 | - pexpect=4.8.0=py37_0 63 | - pip=20.0.2=py37_0 64 | - prometheus_client=0.7.1=py_0 65 | - prompt_toolkit=3.0.3=py_0 66 | - protobuf=3.11.2=py37h0a44026_0 67 | - ptyprocess=0.6.0=py_1001 68 | - pygments=2.5.2=py_0 69 | - pyrsistent=0.15.7=py37h0b31af3_0 70 | - python=3.7.6=h359304d_2 71 | - readline=7.0=h1de35cc_5 72 | - scipy=1.3.1=py37h1410ff5_0 73 | - send2trash=1.5.0=py_0 74 | - setuptools=45.1.0=py37_0 75 | - six=1.14.0=py37_0 76 | - sqlite=3.30.1=ha441bb4_0 77 | - tensorflow=2.0.0=mkl_py37hda344b4_0 78 | - tensorflow-base=2.0.0=mkl_py37h66b1bf0_0 79 | - tensorflow-estimator=2.0.0=pyh2649769_0 80 | - termcolor=1.1.0=py37_1 81 | - testpath=0.4.4=py_0 82 | - tk=8.6.8=ha441bb4_0 83 | - traitlets=4.3.3=py37_0 84 | - wcwidth=0.1.8=py_0 85 | - werkzeug=0.16.0=py_0 86 | - wheel=0.33.6=py37_0 87 | - wrapt=1.11.2=py37h1de35cc_0 88 | - xz=5.2.4=h1de35cc_4 89 | - zeromq=4.3.2=h6de7cb9_2 90 | - zipp=2.1.0=py_0 91 | - zlib=1.2.11=h1de35cc_3 92 | - pip: 93 | - altair==4.0.1 94 | - appnope==0.1.0 95 | - base58==2.0.0 96 | - blinker==1.4 97 | - boto3==1.11.9 98 | - botocore==1.14.9 99 | - chardet==3.0.4 100 | - click==7.0 101 | - coloredlogs==10.0 102 | - cycler==0.10.0 103 | - cython==0.29.14 104 | - docopt==0.6.2 105 | - docutils==0.15.2 106 | - enum-compat==0.0.3 107 | - future==0.18.2 108 | - humanfriendly==4.18 109 | - idna==2.8 110 | - importlib-metadata==1.4.0 111 | - ipython-genutils==0.2.0 112 | - ipywidgets==7.5.1 113 | - jinja2==2.10.3 114 | - jmespath==0.9.4 115 | - joblib==0.14.1 116 | - json5==0.8.5 117 | - jupyter-contrib-core==0.3.3 118 | - jupyter-nbextensions-configurator==0.4.1 119 | - jupyterlab-server==1.0.6 120 | - keras==2.3.1 121 | - kiwisolver==1.1.0 122 | - matplotlib==3.1.2 123 | - pandas==0.25.3 124 | - pandocfilters==1.4.2 125 | - pathtools==0.1.2 126 | - patsy==0.5.1 127 | - pickleshare==0.7.5 128 | - pillow==7.0.0 129 | - plotly==4.5.0 130 | - pmdarima==1.5.2 131 | - pydeck==0.2.1 132 | - pyobjc-core==6.1 133 | - pyobjc-framework-cocoa==6.1 134 | - pyobjc-framework-fsevents==6.1 135 | - pyparsing==2.4.6 136 | - python-dateutil==2.8.0 137 | - pytz==2019.3 138 | - pyyaml==5.3 139 | - pyzmq==18.1.1 140 | - requests==2.22.0 141 | - retrying==1.3.3 142 | - s3transfer==0.3.2 143 | - scikit-learn==0.22.1 144 | - seaborn==0.10.0 145 | - sklearn==0.0 146 | - statsmodels==0.11.0 147 | - streamlit==0.53.0 148 | - ta==0.5.11 149 | - terminado==0.8.3 150 | - toml==0.10.0 151 | - toolz==0.10.0 152 | - tornado==5.1.1 153 | - tqdm==4.42.0 154 | - tzlocal==2.0.0 155 | - urllib3==1.25.8 156 | - validators==0.14.2 157 | - watchdog==0.10.0 158 | - webencodings==0.5.1 159 | - widgetsnbextension==3.5.1 160 | prefix: /opt/anaconda3/envs/deepRLTrader 161 | 162 | -------------------------------------------------------------------------------- /evaluate.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from src.utils import get_stock_data 3 | from src.agent import RLAgent 4 | from src.methods import evaluate_model 5 | from src.utils import show_evaluation_result, load_data, add_technical_features 6 | import os 7 | import coloredlogs 8 | import keras.backend as K 9 | import logging 10 | import pdb 11 | 12 | 13 | def run(eval_stock, window_size, model_name, verbose): 14 | data = add_technical_features(load_data(eval_stock), window = window_size).sort_values(by=['Date'], ascending=True) 15 | num_features = data.shape[1] 16 | 17 | if model_name is not None: 18 | agent = RLAgent(num_features, pretrained=True, model_name=model_name) 19 | profit, history, valid_shares = evaluate_model(agent, data, verbose) 20 | show_evaluation_result(profit) 21 | 22 | 23 | if __name__ == "__main__": 24 | parser = argparse.ArgumentParser(description='Evaluate RLAgent') 25 | parser.add_argument('--eval') 26 | parser.add_argument('--window-size', default = 10) 27 | parser.add_argument('--model-name') 28 | parser.add_argument('--verbose', default = True) 29 | 30 | args = parser.parse_args() 31 | 32 | eval_stock = args.eval 33 | window_size = int(args.window_size) 34 | model_name = args.model_name 35 | verbose = args.verbose 36 | 37 | coloredlogs.install(level="DEBUG") 38 | 39 | if K.backend() == "tensorflow": 40 | logging.debug("Switching --> TensorFlow for CPU") 41 | os.environ["CUDA_VISIBLE_DEVICES"] = "-1" 42 | 43 | try: 44 | run(eval_stock, window_size, model_name, verbose) 45 | except KeyboardInterrupt: 46 | print("Aborted with Keyboard Interrupt..") 47 | -------------------------------------------------------------------------------- /how_it_works.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import pandas as pd 3 | 4 | from src.utils import ( 5 | load_data, 6 | add_technical_features, 7 | show_evaluation_result, 8 | normalize, 9 | results_df, 10 | get_portfolio_stats, 11 | plot_trades, 12 | plot_benchmark 13 | ) 14 | from PIL import Image 15 | 16 | def how_it_works(): 17 | 18 | st.header('How It Works') 19 | 20 | st.subheader('Reinforcement Learning Primer') 21 | 22 | st.write('We will frame market trading in a reinforcement learning context.') 23 | rl_diagram = Image.open('public/rl_diagram.png') 24 | st.image(rl_diagram, caption='Reinforcement Learning Process', use_column_width=True) 25 | 26 | st.markdown('1. The Agent observes the environment, in the form of a state \n 2. Based on that state, the Agent takes a certain action based upon a policy \n 3. For that given action, and state, the Agent receives a reward from the environment. \n 4. The action mutates the environment to transition to a new state. \n 5. Repeat.') 27 | 28 | st.markdown('Q-learning is a model-free algorithm in RL for the purpose of learning a policy. The policy of an agent is arguably the most important as it is the policy that drives how the agent interacts with its environment. We define the "goodness" of an action by using the mathematical action-value function **Q(s,a)**. The higher the Q-value, the higher probability that given action _a_ in state _s_ will bring a higher reward _r_.') 29 | 30 | st.markdown('We can use a table to store experience tuples, namely a _Q-table_, to take a discrete input of state _s_ and action _a_ and output an associated Q-value. The one limitation of this method, despite its intuitiveness, is the scalability. With continuous states such as a stock price, the computational space would be inefficient to store _n_ states by _m_ actions. Chess for example would take a 10^120 size states space.') 31 | 32 | st.write('Instead of storing a massive lookup table, we can instead approximate Q(s,a) with neural networks, named a Deep Q Network (DQN)') 33 | 34 | 35 | dqn = Image.open('public/dqn.png') 36 | st.image(dqn, caption = 'Using a Deep Q Network can approximate Q(s,a)', use_column_width = True) 37 | 38 | st.write('In 2015, Google DeepMind showed that in stochastic environments, Q-learning and DQN tends to overestimate and learn very poorly. From a high level perspective, these overestimations tend to result from a positive bias due to taking the maximum expected action value. Hasselt, et.al proposed using a double estimator to construct DQN and showed that the Double DQN (DDQN) converged to a more optimal policy and tended to estimate the true value more closely.') 39 | 40 | estimate = Image.open('public/ddqn_estimate.png') 41 | st.image(estimate, use_column_width = True, caption = 'DQN tends to overestimate action values') 42 | 43 | st.subheader('Data Process') 44 | st.write('Time series daily data is extracted via API request from Alpha Vantage. Example Google financial data extracted for a given time period shown below:') 45 | 46 | @st.cache 47 | def load_data_(symbol, window_size): 48 | data_ = add_technical_features(load_data(f'data/{symbol}.csv'), window = window_size).sort_values(by=['Date'], ascending=True) 49 | return data_ 50 | 51 | data = pd.read_csv('data/GOOG.csv') 52 | st.dataframe(data.head()) 53 | st.markdown('From the above data example, feature generation occurs.\n Technical indicators are derived from fundamental price and volume in the categories of:') 54 | st.markdown('* Trend \n * Momentum \n* Volatility \n* Volume') 55 | st.write('The final dataframe with a total of 33 included technical indicators is shown below:') 56 | st.dataframe(load_data_('GOOG', 10).head()) 57 | st.markdown('The above example is then normalized and fed through the Double Deep Q network that will be discussed below. ') 58 | st.markdown('#### Training Data') 59 | st.write('The RL agent is trained on 7-10 years of historical data.') 60 | st.markdown('#### Test Data') 61 | st.write('The RL agent is tested on an unseen set of 1-2 years of price/volume data. In most examples, this would be 2019 price/volume data') 62 | 63 | st.subheader('Model') 64 | 65 | 66 | st.subheader('Results') 67 | -------------------------------------------------------------------------------- /models/AAPL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/AAPL -------------------------------------------------------------------------------- /models/AMZN: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/AMZN -------------------------------------------------------------------------------- /models/FB: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/FB -------------------------------------------------------------------------------- /models/GOOG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/GOOG -------------------------------------------------------------------------------- /models/IBM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/IBM -------------------------------------------------------------------------------- /models/JNJ: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/JNJ -------------------------------------------------------------------------------- /models/NFLX: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/NFLX -------------------------------------------------------------------------------- /models/SPY: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/SPY -------------------------------------------------------------------------------- /models/TSLA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/models/TSLA -------------------------------------------------------------------------------- /public/AMZN_bad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/AMZN_bad.png -------------------------------------------------------------------------------- /public/GOOG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/GOOG.png -------------------------------------------------------------------------------- /public/bad_benchmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/bad_benchmark.png -------------------------------------------------------------------------------- /public/benchmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/benchmark.png -------------------------------------------------------------------------------- /public/ddqn_estimate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/ddqn_estimate.png -------------------------------------------------------------------------------- /public/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/demo.gif -------------------------------------------------------------------------------- /public/demo_model.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/demo_model.gif -------------------------------------------------------------------------------- /public/dqn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/dqn.png -------------------------------------------------------------------------------- /public/rl_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeepNeuralAI/RL-DeepQLearning-Trading/4c76769543e26c43837641c0681d5bbbde8b9c27/public/rl_diagram.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.8.1 2 | altair==4.0.1 3 | appnope==0.1.0 4 | astor==0.8.0 5 | attrs==19.3.0 6 | backcall==0.1.0 7 | base58==2.0.0 8 | bleach==3.1.0 9 | blinker==1.4 10 | boto3==1.11.9 11 | botocore==1.14.9 12 | certifi==2019.11.28 13 | chardet==3.0.4 14 | Click==7.0 15 | coloredlogs==10.0 16 | cycler==0.10.0 17 | Cython==0.29.14 18 | decorator==4.4.1 19 | defusedxml==0.6.0 20 | docopt==0.6.2 21 | docutils==0.15.2 22 | entrypoints==0.3 23 | enum-compat==0.0.3 24 | future==0.18.2 25 | gast==0.2.2 26 | google-pasta==0.1.8 27 | grpcio==1.16.1 28 | h5py==2.9.0 29 | humanfriendly==4.18 30 | idna==2.8 31 | importlib-metadata==1.5.0 32 | inflect==4.0.0 33 | ipykernel==5.1.4 34 | ipython==7.11.1 35 | ipython-genutils==0.2.0 36 | ipywidgets==7.5.1 37 | jaraco.itertools==5.0.0 38 | jedi==0.16.0 39 | Jinja2==2.11.0 40 | jmespath==0.9.4 41 | joblib==0.14.1 42 | json5==0.8.5 43 | jsonschema==3.2.0 44 | jupyter-client==5.3.4 45 | jupyter-contrib-core==0.3.3 46 | jupyter-core==4.6.1 47 | jupyter-nbextensions-configurator==0.4.1 48 | jupyterlab-server==1.0.6 49 | Keras==2.3.1 50 | Keras-Applications==1.0.8 51 | Keras-Preprocessing==1.1.0 52 | kiwisolver==1.1.0 53 | Markdown==3.1.1 54 | MarkupSafe==1.1.1 55 | matplotlib==3.1.2 56 | mistune==0.8.4 57 | more-itertools==8.2.0 58 | nbconvert==5.6.1 59 | nbformat==5.0.4 60 | notebook==6.0.3 61 | numpy==1.18.1 62 | opt-einsum==3.1.0 63 | pandas==0.25.3 64 | pandocfilters==1.4.2 65 | parso==0.6.0 66 | pathtools==0.1.2 67 | patsy==0.5.1 68 | pexpect==4.8.0 69 | pickleshare==0.7.5 70 | Pillow==7.0.0 71 | plotly==4.5.0 72 | pmdarima==1.5.2 73 | prometheus-client==0.7.1 74 | prompt-toolkit==3.0.3 75 | protobuf==3.11.2 76 | ptyprocess==0.6.0 77 | pydeck==0.2.1 78 | Pygments==2.5.2 79 | pyparsing==2.4.6 80 | pyrsistent==0.15.7 81 | python-dateutil==2.8.1 82 | pytz==2019.3 83 | PyYAML==5.3 84 | pyzmq==18.1.1 85 | requests==2.22.0 86 | retrying==1.3.3 87 | s3transfer==0.3.2 88 | scikit-learn==0.22.1 89 | scipy==1.3.1 90 | seaborn==0.10.0 91 | Send2Trash==1.5.0 92 | six==1.14.0 93 | sklearn==0.0 94 | statsmodels==0.11.0 95 | streamlit==0.53.0 96 | ta==0.5.11 97 | tensorboard==2.0.0 98 | tensorflow==2.0.0 99 | tensorflow-estimator==2.0.0 100 | termcolor==1.1.0 101 | terminado==0.8.3 102 | testpath==0.4.4 103 | toml==0.10.0 104 | toolz==0.10.0 105 | tornado==6.0.3 106 | tqdm==4.42.0 107 | traitlets==4.3.3 108 | tzlocal==2.0.0 109 | urllib3==1.25.8 110 | validators==0.14.2 111 | watchdog==0.10.0 112 | wcwidth==0.1.8 113 | webencodings==0.5.1 114 | Werkzeug==0.16.0 115 | widgetsnbextension==3.5.1 116 | wrapt==1.11.2 117 | zipp==2.1.0 118 | -------------------------------------------------------------------------------- /src/BaselineModel.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import pdb 4 | 5 | class BaselineModel(): 6 | def __init__(self, symbol, data, max_shares = 10): 7 | self.symbol = symbol 8 | self.data = data 9 | self.max_shares = max_shares 10 | self.shares = self.shares_df() 11 | 12 | def shares_df(self): 13 | shares = np.zeros(self.data.shape[0]) 14 | shares[0] = self.max_shares 15 | shares[-1] = -self.max_shares 16 | return shares[:, None] 17 | -------------------------------------------------------------------------------- /src/HeuristicTrader.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | 4 | class HeuristicTrader(): 5 | def __init__(self, symbol, data, window = 7, max_shares = 10): 6 | self.symbol = symbol 7 | self.window, self.max_shares = window, max_shares 8 | self.data = data 9 | self.policy = self.strategy() 10 | self.shares = self.shares_df() 11 | 12 | 13 | def strategy(self): 14 | tmp_df = pd.DataFrame(index = self.data.index) 15 | tmp_df['indicator'] = np.zeros(self.data.shape[0]) 16 | 17 | buy = (self.data['vol_bbp'] < 0.5) & (self.data['trend_rsi'] <= 30) & \ 18 | (self.data['trend_p2sma'] <= self.data['trend_p2sma'].quantile(0.25)) 19 | sell = (self.data['vol_bbp'] >= 0.5) & (self.data['trend_rsi'] > 50) & \ 20 | (self.data['trend_p2sma'] >= self.data['trend_p2sma'].quantile(.75)) 21 | 22 | tmp_df['indicator'][buy] = 1 23 | tmp_df['indicator'][sell] = -1 24 | return tmp_df 25 | 26 | def shares_df(self): 27 | shares = [] 28 | net_holdings = 0 29 | 30 | for _, row in self.policy.iterrows(): 31 | buy = row['indicator'] > 0 32 | sell = row['indicator'] < 0 33 | 34 | if buy and net_holdings == 0: 35 | shares.append(self.max_shares) 36 | net_holdings += self.max_shares 37 | elif buy and net_holdings == -self.max_shares: 38 | shares.append(self.max_shares * 2) 39 | net_holdings += self.max_shares * 2 40 | elif sell and net_holdings == 0: 41 | shares.append(-self.max_shares) 42 | net_holdings += -self.max_shares 43 | elif sell and net_holdings == self.max_shares: 44 | shares.append(-self.max_shares * 2) 45 | net_holdings += -self.max_shares * 2 46 | else: 47 | shares.append(0) 48 | return shares 49 | -------------------------------------------------------------------------------- /src/agent.py: -------------------------------------------------------------------------------- 1 | import random 2 | from collections import deque 3 | import numpy as np 4 | import tensorflow as tf 5 | import keras.backend as K 6 | from keras.models import Sequential 7 | from keras.models import load_model, clone_model 8 | from keras.layers import Dense 9 | from keras.optimizers import Adam 10 | from tensorflow.keras.losses import Huber 11 | from src.utils import timestamp 12 | import pdb 13 | 14 | class RLAgent: 15 | def __init__(self, state_size, model_type = 'ddqn', pretrained = False, model_name = None, window_size = 10, reset_target_weight_interval = 10): 16 | self.model_type = model_type 17 | 18 | self.state_size = state_size 19 | self.action_size = 3 20 | self.inventory = [] 21 | self.memory = deque(maxlen = 10000) 22 | self.start = True 23 | 24 | self.model_name = model_name 25 | self.gamma = 0.99 26 | self.rar = 0.99 # Epsilon / Random Action Rate 27 | self.eps_min = 0.01 28 | self.radr = 0.995 # Random Action Decay Rate 29 | self.lr = 1e-5 30 | self.loss = Huber 31 | self.custom_objects = {"huber": Huber} 32 | self.optimizer = Adam(lr = self.lr) 33 | self.window_size = window_size 34 | 35 | if pretrained and self.model_name is not None: 36 | self.model = self.load() 37 | else: 38 | self.model = self.model_() 39 | 40 | self.n_iter = 1 41 | self.reset_interval = reset_target_weight_interval 42 | 43 | self.target_model = clone_model(self.model) 44 | self.target_model.set_weights(self.model.get_weights()) 45 | 46 | 47 | def load(self): 48 | model = load_model(f"models/{self.model_name}", custom_objects = self.custom_objects, compile=False) 49 | model.compile(optimizer = self.optimizer, loss = self.loss()) 50 | return model 51 | 52 | def save(self, episode): 53 | if self.model_name is None: 54 | self.model_name = f'{self.model_type}_{timestamp()}' 55 | self.model.save(f"models/{self.model_name}_{episode}") 56 | 57 | def model_(self): 58 | model = Sequential() 59 | model.add(Dense(units=256, activation="relu", input_shape=(self.state_size,))) 60 | model.add(Dense(units=512, activation="relu")) 61 | model.add(Dense(units=512, activation="relu")) 62 | model.add(Dense(units=256, activation="relu")) 63 | model.add(Dense(units=self.action_size)) 64 | 65 | model.compile(optimizer = self.optimizer, loss = self.loss()) 66 | return model 67 | 68 | def action(self, state, evaluation = False): 69 | if self.start: 70 | self.start = False 71 | return 1 72 | 73 | if not evaluation and (random.random() <= self.rar): 74 | return random.randrange(self.action_size) 75 | 76 | action_probs = self.model.predict(state) 77 | return np.argmax(action_probs[0]) 78 | 79 | def replay(self, batch_size): 80 | mini_batch = random.sample(self.memory, batch_size) 81 | X_train, y_train = [], [] 82 | 83 | if self.model_type == 'ddqn': 84 | if self.n_iter % self.reset_interval == 0: 85 | print("Setting Target Weights...") 86 | self.target_model.set_weights(self.model.get_weights()) 87 | 88 | for state, action, reward, next_state, done in mini_batch: 89 | if done: 90 | target = reward 91 | else: 92 | target = reward + self.gamma * self.target_model.predict(next_state)[0][np.argmax(self.model.predict(next_state)[0])] 93 | 94 | q_values = self.model.predict(state) 95 | q_values[0][action] = target 96 | X_train.append(state[0]) 97 | y_train.append(q_values[0]) 98 | 99 | if self.rar > self.eps_min: 100 | self.rar *= self.radr 101 | 102 | loss = self.model.fit( 103 | x = np.array(X_train), 104 | y = np.array(y_train), 105 | epochs = 1, 106 | verbose = 0 107 | ).history["loss"][0] 108 | 109 | return loss 110 | 111 | def remember(self, state, action, reward, next_state, done): 112 | self.memory.append((state, action, reward, next_state, done)) 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /src/methods.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | import numpy as np 4 | from tqdm import tqdm 5 | from src.utils import get_state, format_currency, format_position, normalize 6 | import pdb 7 | 8 | ''' 9 | 1. Move daily_pct_return to utils 10 | 2. Move calc_reward to utils 11 | ''' 12 | 13 | def daily_pct_change(prices, shift): 14 | pct_change = (prices.copy() / prices.copy().shift(periods = shift)) - 1 15 | pct_change[:shift] = 0 16 | return pct_change 17 | 18 | def calc_reward(pct_change, net_holdings): 19 | return pct_change * net_holdings 20 | 21 | def train_model(agent, episode, data, episode_count = 50, batch_size = 32, window_size = 10): 22 | total_profit = 0 23 | num_observations = len(data) 24 | 25 | agent.inventory = [] 26 | shares_history = [] 27 | average_loss = [] 28 | 29 | net_holdings = 0 30 | normed_data = normalize(data) 31 | pct_change = daily_pct_change(data.price, window_size) 32 | 33 | for t in tqdm(range(num_observations), total = num_observations, leave = True, desc = f'Episode {episode}/{episode_count}'): 34 | done = t == (num_observations - 1) 35 | 36 | state = get_state(normed_data, t) 37 | action = agent.action(state) 38 | 39 | if action == 2 and net_holdings == 0: 40 | shares = -100 41 | net_holdings += -100 42 | elif action == 2 and net_holdings == 100: 43 | shares = -200 44 | net_holdings += -200 45 | elif action == 1 and net_holdings == 0: 46 | shares = 100 47 | net_holdings += 100 48 | elif action == 1 and net_holdings == -100: 49 | shares = 200 50 | net_holdings += 200 51 | else: 52 | shares = 0 53 | shares_history.append(shares) 54 | 55 | reward = calc_reward(pct_change[t] * 100, net_holdings) 56 | total_profit += reward 57 | 58 | # if action == 1: # Buy 59 | # agent.inventory.append(data.price[t]) 60 | # 61 | # reward -= 1e-5 # Commission Penalty 62 | 63 | # elif action == 2 and len(agent.inventory) > 0: # Sell 64 | # purchase_price = agent.inventory.pop(0) 65 | # delta = data.price[t] - purchase_price 66 | # reward = delta - 1e-5 # Commission Penalty 67 | # total_profit += delta 68 | # shares.append(-1) 69 | 70 | # else: # Hold 71 | # shares.append(0) 72 | # reward -= 1e-3 73 | 74 | if not done: 75 | next_state = get_state(normed_data, t + 1) 76 | agent.remember(state, action, reward, next_state, done) 77 | state = next_state 78 | 79 | if len(agent.memory) > batch_size: 80 | loss = agent.replay(batch_size) 81 | average_loss.append(loss) 82 | 83 | if episode % 10 == 0: 84 | agent.save(episode) 85 | 86 | if done: return (episode, episode_count, total_profit, np.array(average_loss).mean()) 87 | 88 | def evaluate_model(agent, data, verbose, window_size = 10): 89 | total_profit = 0 90 | num_observations = len(data) 91 | 92 | shares = [] 93 | history = [] 94 | agent.inventory = [] 95 | normed_data = normalize(data) 96 | cum_return = [] 97 | net_holdings = 0 98 | shares_history = [] 99 | pct_change = daily_pct_change(data.price, 10) 100 | 101 | for t in range(num_observations): 102 | done = t == (num_observations - 1) 103 | reward = 0 104 | 105 | state = get_state(normed_data, t) 106 | action = agent.action(state, evaluation = True) 107 | 108 | if action == 2 and net_holdings == 0: 109 | shares = -10 110 | net_holdings += -10 111 | history.append((data.price[t], "SELL")) 112 | elif action == 2 and net_holdings == 10: 113 | shares = -20 114 | net_holdings += -20 115 | history.append((data.price[t], "SELL")) 116 | elif action == 1 and net_holdings == 0: 117 | shares = 10 118 | net_holdings += 10 119 | history.append((data.price[t], "BUY")) 120 | elif action == 1 and net_holdings == -10: 121 | shares = 20 122 | net_holdings += 20 123 | history.append((data.price[t], "BUY")) 124 | else: 125 | shares = 0 126 | history.append((data.price[t], "HOLD")) 127 | shares_history.append(shares) 128 | 129 | reward = calc_reward(pct_change[t], net_holdings) 130 | total_profit += reward 131 | # if action == 1: 132 | # agent.inventory.append(data.price[t]) 133 | # shares.append(1) 134 | # history.append((data.price[t], "BUY")) 135 | 136 | # if verbose: 137 | # logging.debug(f"Buy at: {format_currency(data.price[t])}") 138 | 139 | # elif action == 2 and len(agent.inventory) > 0: 140 | # purchase_price = agent.inventory.pop(0) 141 | # delta = data.price[t] - purchase_price 142 | # reward = delta 143 | # total_profit += delta 144 | # shares.append(-1) 145 | # history.append((data.price[t], "SELL")) 146 | 147 | # if verbose: 148 | # logging.debug(f"Sell at: {format_currency(data.price[t])} | Position: {format_position(data.price[t] - purchase_price)}") 149 | 150 | # else: 151 | # history.append((data.price[t], "HOLD")) 152 | # shares.append(0) 153 | # cum_return.append(total_profit) 154 | 155 | if not done: 156 | next_state = get_state(normed_data, t + 1) 157 | agent.memory.append((state, action, reward, next_state, done)) 158 | state = next_state 159 | 160 | if done: return total_profit, history, shares_history 161 | 162 | 163 | -------------------------------------------------------------------------------- /src/technical_indicators.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import ta 4 | 5 | def add_momentum_indicators(high, low, close, volume, n_period = 7, fillna=True): 6 | """ 7 | Money Flow Index (MFI) 8 | True strength index (TSI) 9 | Kaufman's Adaptive Moving Average (KAMA) 10 | """ 11 | df = pd.DataFrame(index = close.index) 12 | df['mom_mfi'] = ta.momentum.MFIIndicator(high, low, close, volume, n_period, fillna = fillna).money_flow_index() 13 | df['mom_tsi'] = ta.momentum.TSIIndicator(close, fillna = fillna).tsi() 14 | df['mom_kama'] = ta.momentum.kama(close, fillna=fillna) 15 | return df 16 | 17 | def add_trend_indicators(high, low, close, volume, n_period = 7, fillna = True): 18 | """ 19 | Vortex Indicator (VI) 20 | Trix (TRIX) 21 | Mass Index (MI) 22 | Commodity Channel Index (CCI) 23 | Detrended Price Oscillator (DPO) 24 | KST Oscillator (KST) 25 | Ichimoku Kinkō Hyō (Ichimoku) 26 | Parabolic Stop And Reverse (Parabolic SAR) 27 | """ 28 | df = pd.DataFrame(index = close.index) 29 | df['trend_vi'] = ta.trend.VortexIndicator(high, low, close, n_period, fillna).vortex_indicator_diff() 30 | df['trend_trix'] = ta.trend.trix(close, n_period, fillna) 31 | df['trend_mi'] = ta.trend.MassIndex(high, low, fillna=fillna).mass_index() 32 | df['trend_cci'] = ta.trend.CCIIndicator(high, low, close, fillna=fillna).cci() 33 | df['trend_dpo'] = ta.trend.DPOIndicator(close, n_period, fillna).dpo() 34 | df['trend_kst'] = ta.trend.kst_sig(close, fillna=fillna) 35 | df['trend_ichimoku'] = ta.trend.IchimokuIndicator(high, low, fillna=fillna).ichimoku_a() 36 | df['trend_sar'] = ta.trend.PSARIndicator(high, low, close, fillna=fillna).psar() 37 | return df 38 | 39 | def add_volatility_indicators(high, low, close, n_period = 7, fillna=True): 40 | """ 41 | Average True Range (ATR) 42 | Keltner Channel (KC) 43 | Donchian Channel (DC) 44 | """ 45 | df = pd.DataFrame(index = close.index) 46 | df['vol_atr'] = ta.volatility.AverageTrueRange(high, low, close, n_period, fillna).average_true_range() 47 | df['vol_kc'] = ta.volatility.KeltnerChannel(high, low, close, n_period, fillna).keltner_channel_central() 48 | df['vol_dc_hband'] = ta.volatility.DonchianChannel(close, n_period, fillna = fillna).donchian_channel_hband() 49 | df['vol_dc_lband'] = ta.volatility.DonchianChannel(close, n_period, fillna = fillna).donchian_channel_lband() 50 | return df 51 | 52 | def add_volume_indicators(high, low, close, volume, n_period = 7, fillna=True): 53 | """ 54 | Accumulation/Distribution Index (ADI) 55 | Chaikin Money Flow (CMF) 56 | Volume-price Trend (VPT) 57 | Negative Volume Index (NVI) 58 | """ 59 | df = pd.DataFrame(index = close.index) 60 | df['volume_adi'] = ta.volume.AccDistIndexIndicator(high, low, close, volume, fillna).acc_dist_index() 61 | df['volume_cmf'] = ta.volume.ChaikinMoneyFlowIndicator(high, low, close, volume, n_period, fillna).chaikin_money_flow() 62 | df['volume_vpt'] = ta.volume.VolumePriceTrendIndicator(close, volume, fillna).volume_price_trend() 63 | df['volume_nvi'] = ta.volume.NegativeVolumeIndexIndicator(close, volume, fillna).negative_volume_index() 64 | return df 65 | 66 | def find_indexes(indicator_type, columns): 67 | indicator = f'{indicator_type}_' 68 | indexes = [] 69 | for index, col in enumerate(columns): 70 | if indicator in col: indexes.append(index) 71 | return indexes 72 | 73 | def get_indicators_by_type(indicator_type, data): 74 | cols = data.columns.values 75 | indexes = find_indexes(indicator_type, cols) 76 | indicators = cols[indexes] 77 | return data.loc[:, indicators] 78 | 79 | def normalize(prices): 80 | return prices / prices.values[0] 81 | 82 | # momentum 83 | def relative_strength_index(prices, window = 7): 84 | diff = prices.diff().fillna(0) 85 | gain, loss = diff.copy(), diff.copy() 86 | 87 | gain[gain < 0] = 0 88 | loss[loss > 0] = 0 89 | 90 | rs_up = exponential_moving_average(gain, window) 91 | rs_down = exponential_moving_average(loss.abs(), window) 92 | rs = rs_up / rs_down 93 | rsi = 100 - (100 / (1 + rs)) 94 | return rsi.fillna(method='bfill') 95 | 96 | def momentum(prices, window = 7): 97 | moment = (prices / prices.shift(window)) - 1 98 | return moment.fillna(method='bfill') 99 | 100 | def stochastic_oscillator_k(prices, window = 7): 101 | rolling_max = prices.rolling(window).max().fillna(method='bfill') 102 | rolling_min = prices.rolling(window).min().fillna(method='bfill') 103 | return (prices - rolling_min) / (rolling_max - rolling_min) 104 | 105 | 106 | def stochastic_oscillator_d(prices, k_window = 7, d_window = 3): 107 | stok = stochastic_oscillator_k(prices, k_window) 108 | return stok.rolling(window = d_window).mean().fillna(method ='bfill') 109 | 110 | # volume 111 | def on_balance_volume(prices, volume): 112 | vol = prices.diff().fillna(0).apply(np.sign) * volume 113 | vol.iloc[0] = 1. 114 | return vol.cumsum() 115 | 116 | # trend 117 | def simple_moving_average(prices, window = 7): 118 | sma = prices.rolling(window).mean() 119 | sma = sma.fillna(method='bfill') 120 | return sma 121 | 122 | def price_to_sma(prices, sma): 123 | return prices / sma 124 | 125 | def exponential_moving_average(prices, window = 7): 126 | return prices.ewm(span=window, adjust=False).mean() 127 | 128 | def price_to_ema(prices, ema): 129 | return prices / ema 130 | 131 | def moving_average_convergence_divergence(prices, short_window = 7, long_window = 14): 132 | short = prices.ewm(span = short_window, adjust = False).mean() 133 | long = prices.ewm(span = long_window, adjust = False).mean() 134 | return short - long 135 | 136 | # volatility 137 | def bollinger_bands(prices, sma): 138 | std = prices.std(axis = 0) 139 | upper = sma + 2*std 140 | lower = sma - 2*std 141 | return lower, upper 142 | 143 | def bollinger_band_pct(prices, sma): 144 | lower, upper = bollinger_bands(prices, sma) 145 | return (prices - lower) / (upper - lower) 146 | 147 | def indicators_dict(data, window = 7): 148 | prices = data.adjusted_close 149 | volume = data.volume 150 | return { 151 | 'price': prices, 152 | 'trend_rsi': relative_strength_index(prices, window), 153 | 'mom_moms': momentum(prices, window), 154 | 'trend_stok': stochastic_oscillator_k(prices, window), 155 | 'trend_stod': stochastic_oscillator_d(prices, window), 156 | 'volume_obv': on_balance_volume(prices, volume), 157 | 'trend_sma': simple_moving_average(prices, window), 158 | 'trend_p2sma': price_to_sma(prices, simple_moving_average(prices, window)), 159 | 'trend_ema': exponential_moving_average(prices, window), 160 | 'trend_p2ema': price_to_ema(prices, exponential_moving_average(prices)), 161 | 'trend_macd': moving_average_convergence_divergence(prices), 162 | 'vol_bbl': bollinger_bands(prices, simple_moving_average(prices))[0], 163 | 'vol_bbh': bollinger_bands(prices, simple_moving_average(prices))[1], 164 | 'vol_bbp': bollinger_band_pct(prices, simple_moving_average(prices)) 165 | } 166 | -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | import datetime as dt 2 | import math 3 | import logging 4 | import pandas as pd 5 | import numpy as np 6 | import pdb 7 | import plotly.express as px 8 | import plotly.graph_objects as go 9 | 10 | from .technical_indicators import ( 11 | indicators_dict, 12 | add_momentum_indicators, 13 | add_trend_indicators, 14 | add_volatility_indicators, 15 | add_volume_indicators 16 | ) 17 | 18 | def timestamp(): 19 | return round(dt.datetime.now().timestamp()) 20 | 21 | def format_position(price): 22 | if price < 0: 23 | return f'-${abs(price)}' 24 | else: 25 | return f'+${abs(price)}' 26 | 27 | def normalize(df): 28 | result = df.copy() 29 | for feature_name in df.columns: 30 | max_value = df[feature_name].max() 31 | min_value = df[feature_name].min() 32 | result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value) 33 | return result 34 | 35 | def format_currency(price): 36 | return f'${abs(price)}' 37 | 38 | def sigmoid(x): 39 | return 1 / (1 + math.exp(-x)) 40 | 41 | def get_state(data, t): 42 | return np.array([data.iloc[t]]) 43 | 44 | def show_training_result(result, val_position): 45 | logging.info(f'Episode {result[0]}/{result[1]} - Train Position: {format_position(result[2])} Val Position: {format_position(val_position)} Train Loss: {result[3]})') 46 | 47 | def show_evaluation_result(profit): 48 | logging.info(f'{format_position(profit)}\n') 49 | 50 | def get_stock_data(stock_file): 51 | df = pd.read_csv(stock_file) 52 | return list(df['Adj Close']) 53 | 54 | def load_data(path): 55 | temp = pd.read_csv(path) 56 | 57 | if "Date" in temp.columns: 58 | temp.index = temp["Date"] 59 | temp.index = pd.to_datetime(temp.index, infer_datetime_format=True) 60 | temp.drop('Date', axis = 1, inplace = True) 61 | temp.rename(columns={f'Adj Close': 'adjusted_close'}, inplace=True) 62 | temp.columns = map(str.lower, temp.columns) 63 | else: 64 | temp.index = temp['timestamp'] 65 | temp.index = pd.to_datetime(temp.index, infer_datetime_format=True) 66 | temp.index.name = 'Date' 67 | temp.drop('timestamp', axis = 1, inplace = True) 68 | 69 | temp = temp.loc[:, ['adjusted_close', 'high', 'close', 'open', 'low', 'volume']] 70 | return temp 71 | 72 | def add_technical_features(data, window, fillna = True): 73 | inds = indicators_dict(data, window = window) 74 | df = pd.DataFrame(index = data.index) 75 | for key in inds.keys(): df[key] = inds[key] 76 | 77 | high, low, close, volume = data.high, data.low, data.close, data.volume 78 | df = df.join(add_momentum_indicators(high, low, close, volume, window, fillna)) 79 | df = df.join(add_trend_indicators(high, low, close, volume, window, fillna)) 80 | df = df.join(add_volatility_indicators(high, low, close, window, fillna)) 81 | df = df.join(add_volume_indicators(high, low, close, volume, window, fillna)) 82 | return df 83 | 84 | def results_df(price, shares, starting_value = 10_000): 85 | results = pd.DataFrame(columns = ['Price', 'Shares', 'Cash', 'Net_Cash', 'Net_Holdings', 'Value', 'Port_Vals']) 86 | results.Price = price 87 | results.Shares = shares 88 | results.Cash = np.zeros(results.shape[0]) 89 | results.Cash = results.Shares * -results.Price 90 | results.Cash[0] += starting_value 91 | results.Net_Cash = results.Cash.cumsum() 92 | 93 | results.Net_Holdings = results.Shares.cumsum() 94 | results.Value = results.Price * results.Net_Holdings 95 | results.Port_Vals = results.Net_Cash + results.Value 96 | return results 97 | 98 | def get_portfolio_stats(port_val, daily_rf = 0, samples_per_year = 252): 99 | cum_return = (port_val[-1] / port_val[0]) - 1 100 | daily_returns = (port_val /port_val.shift(1)) - 1 101 | daily_returns.iloc[0] = 0 102 | daily_returns = daily_returns[1:] 103 | 104 | avg_daily_returns = daily_returns.mean() 105 | std_daily_returns = daily_returns.std() 106 | 107 | K = np.sqrt(samples_per_year) 108 | sharpe_ratio = K * (avg_daily_returns - daily_rf) / std_daily_returns 109 | return cum_return, avg_daily_returns, std_daily_returns, sharpe_ratio 110 | 111 | def plot_trades(data, trades, symbol): 112 | buy_x = trades.index[trades > 0] 113 | buy_y = data.price[trades > 0] 114 | 115 | sell_x = trades.index[trades < 0] 116 | sell_y = data.price[trades < 0] 117 | 118 | fig = px.line(data, x=data.index, y='price') 119 | fig.add_trace(go.Scatter( 120 | x=buy_x, 121 | y=buy_y, 122 | mode="markers", 123 | opacity = 0.8, 124 | marker = dict(size = 7, symbol = 0, color = 'lime', 125 | line=dict(width=1,color='DarkSlateGrey') 126 | ), 127 | name="Buy", 128 | )) 129 | fig.add_trace(go.Scatter( 130 | x=sell_x, 131 | y=sell_y, 132 | mode="markers", 133 | opacity = 0.8, 134 | marker = dict(size = 7, symbol = 2, color = 'red'), 135 | name="Sell", 136 | )) 137 | fig.update_layout( 138 | xaxis_title="Date", 139 | yaxis_title='Price', 140 | legend_title=' Action ', 141 | template='plotly_white', 142 | title = f'{symbol}' 143 | ) 144 | return fig 145 | 146 | def plot_benchmark(baseline_results, heuristic_results, model_results): 147 | fig = go.Figure() 148 | fig.add_trace(go.Line( 149 | x=baseline_results.index, 150 | y=baseline_results.Port_Vals / baseline_results.Port_Vals[0], 151 | mode="lines", 152 | name="Baseline", 153 | )) 154 | fig.add_trace(go.Line( 155 | x=baseline_results.index, 156 | y=heuristic_results.Port_Vals / heuristic_results.Port_Vals[0], 157 | mode="lines", 158 | name="Heuristic", 159 | )) 160 | fig.add_trace(go.Line( 161 | x=baseline_results.index, 162 | y=model_results.Port_Vals / model_results.Port_Vals[0], 163 | mode="lines", 164 | name="DDQN", 165 | )) 166 | fig.update_layout(title='Benchmark', 167 | xaxis_title='Date', 168 | yaxis_title='Normalized Portfolio Value ($)', 169 | template='plotly_white' 170 | ) 171 | return fig 172 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import os 3 | import logging 4 | import coloredlogs 5 | from docopt import docopt 6 | import datetime as dt 7 | import keras.backend as K 8 | from src.utils import ( 9 | timestamp, 10 | show_training_result, 11 | load_data, 12 | add_technical_features 13 | ) 14 | from src.methods import train_model, evaluate_model 15 | from src.agent import RLAgent 16 | import pdb 17 | 18 | def run(training_stock, validation_stock, window_size, batch_size, episode_count, model_type="ddqn", model_name = None, pretrained = False, verbose = False): 19 | training_data = add_technical_features(load_data(training_stock), window = window_size).sort_values(by=['Date'], ascending=True) 20 | validation_data = add_technical_features(load_data(validation_stock), window = window_size).sort_values(by=['Date'], ascending=True) 21 | 22 | 23 | num_features = training_data.shape[1] 24 | agent = RLAgent(state_size = num_features, model_type = model_type, model_name = model_name, window_size = window_size) 25 | 26 | for episode in range(1, episode_count + 1): 27 | agent.n_iter += 1 28 | 29 | training_result = train_model(agent, episode, training_data, episode_count = episode_count, batch_size = batch_size, window_size = window_size) 30 | validation_profit, history, valid_shares = evaluate_model(agent, validation_data, verbose) 31 | 32 | show_training_result(training_result, validation_profit) 33 | 34 | 35 | if __name__ == '__main__': 36 | parser = argparse.ArgumentParser(description='Deep RL in Algo Trading') 37 | parser.add_argument('--train') 38 | parser.add_argument('--valid') 39 | parser.add_argument('--model-type', default = 'ddqn') 40 | parser.add_argument('--window-size', default = 10) 41 | parser.add_argument('--batch-size', default = 32) 42 | parser.add_argument('--episode-count', default = 50) 43 | parser.add_argument('--model-name') 44 | parser.add_argument('--pretrained', default = False) 45 | parser.add_argument('--verbose', default = False) 46 | 47 | args = parser.parse_args() 48 | 49 | training_stock = args.train 50 | validation_stock = args.valid 51 | model_type = args.model_type 52 | window_size = int(args.window_size) 53 | batch_size = int(args.batch_size) 54 | episode_count = int(args.episode_count) 55 | 56 | 57 | model_name = args.model_name 58 | pretrained = args.pretrained 59 | verbose = args.verbose 60 | 61 | coloredlogs.install(level = "DEBUG") 62 | 63 | if K.backend() == "tensorflow": 64 | logging.debug("Switching --> TensorFlow for CPU") 65 | os.environ["CUDA_VISIBLE_DEVICES"] = "-1" 66 | os.environ['KMP_DUPLICATE_LIB_OK']='True' 67 | 68 | try: 69 | run(training_stock, validation_stock, window_size, batch_size, episode_count, 70 | model_type=model_type, pretrained = pretrained, verbose = verbose) 71 | except KeyboardInterrupt: 72 | print("Aborted with Keyboard Interrupt..") 73 | --------------------------------------------------------------------------------