├── .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 | 
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 |
--------------------------------------------------------------------------------