├── .gitignore ├── LICENSE ├── README.md ├── __init__.py ├── agent ├── __init__.py ├── ddpg_agent.py ├── dqn_agent.py └── stochastic_policy_gradient_agent.py ├── agent_training.ipynb ├── data ├── ETH_USD_2016_2018_15min.pkl ├── ETH_USD_2017_2018_15min.pkl └── train.pkl ├── environment_agent_debug.ipynb ├── gdax_client.py ├── get_gdax_data.ipynb └── trading_env ├── __init__.py └── envs ├── __init__.py └── trading_env.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Guilherme Sousa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ml-stock-prediction 2 | 3 | This repository aims to use Reinforcement Learning to backtest and live trade cryptocurrencies with custom OpenAI Gym environments. 4 | 5 | Prerequisites 6 | ============= 7 | 8 | To get this project up and running on your machine, and mainly to be able to use the trading environments, a few dependencies must first be installed. Firstly to install if not already installed NumPy, Pandas, Jupyter and matplotlib by doing: 9 | 10 | ``` 11 | pip install numpy matplotlib ipython jupyter pandas 12 | ``` 13 | OpenAI Gym must also be installed, which can be done with: 14 | 15 | ``` 16 | pip install gym 17 | ``` 18 | Please refer to the OpenAI Gym [repo](https://github.com/openai/gym#installation) for more information. 19 | 20 | To get historical data, place orders or making other requests from GDAX, the [unoficial GDAX python client](https://github.com/danpaquin/gdax-python) by Daniel Paquin is used, which can be installed once again using `pip`: 21 | 22 | ``` 23 | pip install gdax 24 | ``` 25 | OpenAI Environments 26 | =================== 27 | 28 | ### The testing environment 29 | 30 | Similarly to other OpenAI environments, this one can be instanced by 31 | 32 | ```python 33 | import gym 34 | import trading_env 35 | 36 | env_trading = gym.make('test_trading-v0') 37 | ``` 38 | It uses GDAX historical data from January 2017 to March 2018, and a start date can be specified when reseting the environment. A random start date is otherwise chosen. 39 | 40 | ```python 41 | env_trading.reset(date=datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)) 42 | ``` 43 | 44 | One episode represents one month starting at date with timesteps of 15 minutes. Every step returns the last 200 closing prices and volume up until the current step, relative to (divided by) the current closing price and volume. The actions range from -1 to 1 and represent the percentage of the portfolio's crypto sold or fiat used to buy, respectively. 45 | 46 | | States | Actions | Rewards | 47 | | :-------------: |:-------------:| :--------:| 48 | | Box(100, 2) | Box(1) |(-inf, inf)| 49 | 50 | The reward is computed as the relative difference of portfolio value since the last timestep: 51 | 52 | ``` 53 | reward = (current portfolio value - previous portfolio value)/previous portfolio value 54 | ``` 55 | 56 | ### The Live Environment 57 | 58 | This one is still under development 59 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuilhermeGSousa/ml-stock-prediction/a143c683ec96721f7ff5a95004a70d3eda1c8fb4/__init__.py -------------------------------------------------------------------------------- /agent/__init__.py: -------------------------------------------------------------------------------- 1 | from agent.stochastic_policy_gradient_agent import StochasticPolicyGradientAgent 2 | from agent.dqn_agent import DQNAgent 3 | from agent.ddpg_agent import DDPGAgent 4 | from agent import StochasticPolicyGradientAgent 5 | from agent import DQNAgent 6 | from agent import DDPGAgent -------------------------------------------------------------------------------- /agent/ddpg_agent.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | import random 4 | import math 5 | 6 | class DDPGAgent(): 7 | def __init__(self, env, discount_rate = 0.99, batch_size = 128, tau = 0.001, 8 | epsilon=1.0, epsilon_min=0.01, epsilon_log_decay=0.1, 9 | actor_lr = 1e-5, critic_lr = 1e-4, quiet = True): 10 | 11 | self.actor = Actor(env, learning_rate = actor_lr, quiet = quiet, 12 | epsilon=epsilon, epsilon_min=epsilon_min, epsilon_log_decay=epsilon_log_decay, tau = tau) 13 | self.critic = Critic(env, self.actor, learning_rate = critic_lr, quiet = quiet, tau = tau) 14 | 15 | self._batch_size = batch_size 16 | self._discount_rate = discount_rate 17 | 18 | # Memory 19 | self._state_buffer = [] 20 | self._action_buffer = [] 21 | self._q_buffer = [] 22 | 23 | 24 | def store_step(self, state, action, reward, next_state, done): 25 | self._state_buffer.append(state) 26 | self._action_buffer.append(action) 27 | 28 | next_action = self.actor.act_target([next_state]) 29 | if not done: 30 | q_next = self.critic.predict_target_q([next_state], [[next_action]]) 31 | q_expected = reward + self._discount_rate * q_next 32 | else: 33 | q_expected = reward 34 | self._q_buffer.append([q_expected]) 35 | 36 | def train(self): 37 | self._action_buffer = [[a] for a in self._action_buffer] 38 | samples = [] 39 | for t in range(len(self._state_buffer)): 40 | samples.append([self._state_buffer[t], self._action_buffer[t], self._q_buffer[t]]) 41 | np.random.shuffle(samples) 42 | batches = [] 43 | 44 | for i in range(0, len(samples), self._batch_size): 45 | batches.append(samples[i:i + self._batch_size]) 46 | 47 | for batch in batches: 48 | states_batch = [row[0] for row in batch] 49 | actions_batch = [row[1] for row in batch] 50 | q_batch = [row[2] for row in batch] 51 | 52 | self.critic.train(states_batch, q_batch, actions_batch) 53 | action_grads_batch = self.critic.get_action_grads(states_batch, actions_batch) 54 | action_grads_batch = [[a] for a in action_grads_batch] 55 | self.actor.train(states_batch, action_grads_batch) 56 | 57 | self.actor.update_target_network() 58 | self.critic.update_target_network() 59 | 60 | #After applying gradients 61 | self._state_buffer = [] 62 | self._action_buffer = [] 63 | self._q_buffer = [] 64 | 65 | class Actor(): 66 | 67 | def __init__(self, env, learning_rate = 0.0001, epsilon=1.0, epsilon_min=0.01, epsilon_log_decay=0.1, tau = 0.001, quiet = True): 68 | 69 | self._optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate) 70 | self._sess = tf.Session() 71 | self.env = env 72 | self._quiet = quiet 73 | self.epsilon = epsilon 74 | self.epsilon_min = epsilon_min 75 | self.epsilon_decay = epsilon_log_decay 76 | self._tau = tau 77 | 78 | self.state_dim = np.prod(np.array(env.observation_space.shape)) 79 | 80 | self.init = tf.contrib.layers.xavier_initializer() 81 | 82 | #Actor Network 83 | with tf.variable_scope('actor') as actor_vs: 84 | self._state, self.action = self.create_actor_network() 85 | 86 | self.network_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=actor_vs.name) 87 | 88 | #Target Network 89 | with tf.variable_scope('actor_target') as actor_target_vs: 90 | self._target_state, self.target_action = self.create_actor_network() 91 | 92 | self.target_network_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=actor_target_vs.name) 93 | 94 | 95 | 96 | self.update_target_network_params = [self.target_network_params[i].assign(tf.multiply(self.network_params[i],self._tau) 97 | + tf.multiply(self.target_network_params[i], 98 | 1. - self._tau)) 99 | for i in range(len(self.target_network_params))] 100 | 101 | #Computing training op 102 | 103 | self.trainable_vars = tf.trainable_variables() 104 | 105 | self._action_gradients = tf.placeholder(tf.float32, [None, 1], name="action_grad") 106 | 107 | self._var_grads = tf.gradients(self.action, self.network_params, -self._action_gradients) 108 | 109 | self._train_op = self._optimizer.apply_gradients(zip(self._var_grads,self.network_params)) 110 | 111 | #Initializing 112 | self._sess.run(tf.global_variables_initializer()) 113 | self._sess.run([self.target_network_params[i].assign(self.network_params[i]) 114 | for i in range(len(self.target_network_params))]) 115 | 116 | def create_actor_network(self): 117 | 118 | # neural featurizer parameters 119 | h1 = 256 120 | h2 = 128 121 | h3 = 128 122 | 123 | state = tf.placeholder(tf.float32, 124 | shape=(None, self.state_dim)) 125 | 126 | action_hidden = tf.layers.dense(state, h1, 127 | activation = tf.tanh, 128 | kernel_initializer=self.init) 129 | action_hidden_2 = tf.layers.dense(action_hidden, h2, 130 | activation = tf.tanh, 131 | kernel_initializer=self.init) 132 | action_hidden_3 = tf.layers.dense(action_hidden_2, h3, 133 | activation = tf.tanh, 134 | kernel_initializer=self.init) 135 | action = tf.layers.dense(action_hidden_3, 1, 136 | activation = tf.tanh, 137 | kernel_initializer=self.init) 138 | action = tf.squeeze(action) 139 | 140 | return state, action 141 | 142 | def act(self, state, step = None): 143 | 144 | if step is not None: 145 | epsilon = max(self.epsilon_min, min(self.epsilon, 1.0 - math.log10((step + 1) * self.epsilon_decay))) 146 | action = self.env.action_space.sample()[0].item() if (np.random.random() <= epsilon) else self._sess.run(self.action, feed_dict={self._state: state}) 147 | else: 148 | action = self._sess.run(self.action, feed_dict={self._state: state}) 149 | 150 | if not self._quiet: 151 | print("Action: {}".format(action)) 152 | 153 | return action 154 | 155 | def act_target(self, state): 156 | 157 | action = self._sess.run(self.target_action, feed_dict={self._target_state: state}) 158 | 159 | return action 160 | 161 | def train(self, states_batch, actions_grads_batch): 162 | feed_dict={ 163 | self._state: states_batch, 164 | self._action_gradients: actions_grads_batch} 165 | self._sess.run([self._train_op], feed_dict=feed_dict) 166 | 167 | def update_target_network(self): 168 | self._sess.run(self.update_target_network_params) 169 | 170 | class Critic(): 171 | 172 | def __init__(self, env, actor, learning_rate = 0.001, tau = 0.001, quiet = True): 173 | 174 | self._optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate) 175 | self._sess = tf.Session() 176 | self._env = env 177 | self._quiet = quiet 178 | self._tau = tau 179 | 180 | self._state_dim = np.prod(np.array(env.observation_space.shape)) 181 | 182 | self.init = tf.contrib.layers.xavier_initializer() 183 | 184 | #Q function 185 | with tf.variable_scope('q') as q_vs: 186 | self._state, self._action, self.q = self.create_actor_network() 187 | 188 | self.network_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=q_vs.name) 189 | 190 | #Setting up target function 191 | with tf.variable_scope('q_target') as q_target_vs: 192 | self._target_state, self._target_action, self.target_q = self.create_actor_network() 193 | 194 | self.target_network_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=q_target_vs.name) 195 | 196 | self.update_target_network_params = [self.target_network_params[i].assign(tf.multiply(self.network_params[i],self._tau) 197 | + tf.multiply(self.target_network_params[i], 198 | 1. - self._tau)) 199 | for i in range(len(self.target_network_params))] 200 | 201 | #Computing training op 202 | 203 | self._q_expected = tf.placeholder(tf.float32,shape=[None,1], name="q_expected") 204 | 205 | self._loss = tf.losses.mean_squared_error(self._q_expected,self.q) 206 | 207 | self._train_op = self._optimizer.minimize(self._loss) 208 | 209 | self._action_gradients = tf.squeeze(tf.gradients(self.q ,self._action)) 210 | 211 | #Initializing 212 | self._sess.run(tf.global_variables_initializer()) 213 | 214 | self._sess.run([self.target_network_params[i].assign(self.network_params[i]) 215 | for i in range(len(self.target_network_params))]) 216 | 217 | def create_actor_network(self): 218 | 219 | state = tf.placeholder(tf.float32, 220 | shape=(None, self._state_dim)) 221 | 222 | action = tf.placeholder(tf.float32,shape=[None,1]) 223 | 224 | # neural featurizer parameters 225 | h1 = 256 226 | h2 = 128 227 | h3 = 128 228 | 229 | 230 | q_hidden = tf.layers.dense(tf.concat([state, action], 1), h1, 231 | activation = tf.nn.relu, 232 | kernel_initializer=self.init) 233 | q_hidden_2 = tf.layers.dense(q_hidden, h2, 234 | activation = tf.nn.relu, 235 | kernel_initializer=self.init) 236 | q_hidden_3 = tf.layers.dense(q_hidden_2, h3, 237 | activation = tf.nn.relu, 238 | kernel_initializer=self.init) 239 | q = tf.layers.dense(q_hidden_3, 1, 240 | activation = None, 241 | kernel_initializer=self.init) 242 | 243 | q = tf.squeeze(q) 244 | 245 | return state, action, q 246 | 247 | def predict_q(self, state, action): 248 | 249 | q = self._sess.run(self.q, feed_dict={ 250 | self._state: state, 251 | self._action: action}) 252 | return q 253 | 254 | def predict_target_q(self, state, action): 255 | 256 | q = self._sess.run(self.target_q, feed_dict={ 257 | self._target_state: state, 258 | self._target_action: action}) 259 | return q 260 | 261 | def get_action_grads(self, state, action): 262 | grads = self._sess.run(self._action_gradients, feed_dict={ 263 | self._state: state, 264 | self._action: action}) 265 | return grads 266 | 267 | def train(self, states_batch, q_batch, actions_batch): 268 | feed_dict={ 269 | self._state: states_batch, 270 | self._q_expected: q_batch, 271 | self._action: actions_batch} 272 | 273 | self._sess.run([self._train_op], feed_dict=feed_dict) 274 | 275 | def update_target_network(self): 276 | self._sess.run(self.update_target_network_params) 277 | -------------------------------------------------------------------------------- /agent/dqn_agent.py: -------------------------------------------------------------------------------- 1 | import random 2 | from keras.models import Sequential 3 | from keras.layers import Dense 4 | from keras.optimizers import Adam 5 | import numpy as np 6 | import math 7 | 8 | class DQNAgent(): 9 | def __init__(self, env, gamma=0.99, 10 | epsilon=1.0, epsilon_min=0.01, epsilon_log_decay=0.999, 11 | alpha=1e-4, alpha_decay=0.001, batch_size=128, quiet=False): 12 | 13 | self.env = env 14 | self.memory = [] 15 | self.gamma = gamma 16 | self.epsilon = epsilon 17 | self.epsilon_min = epsilon_min 18 | self.epsilon_decay = epsilon_log_decay 19 | self.alpha = alpha 20 | self.alpha_decay = alpha_decay 21 | self._batch_size = batch_size 22 | self.quiet = quiet 23 | self._state_dim = np.prod(np.array(env.observation_space.shape)) 24 | 25 | self.model = Sequential() 26 | self.model.add(Dense(512, input_dim=self._state_dim, activation='relu')) 27 | self.model.add(Dense(256, activation='relu')) 28 | self.model.add(Dense(128, activation='relu')) 29 | self.model.add(Dense(3, activation='linear')) 30 | self.model.compile(loss='mse', optimizer=Adam(lr=self.alpha, decay=self.alpha_decay)) 31 | 32 | def store_step(self, state, action, reward, next_state, done): 33 | self.memory.append((state, action, reward, next_state, done)) 34 | 35 | def act(self, state, step = None): 36 | if step is not None: 37 | epsilon = max(self.epsilon_min, min(self.epsilon, 1.0 - math.log10((step + 1) * self.epsilon_decay))) 38 | return int(self.env.action_space.sample()) if (np.random.random() <= epsilon) else np.argmax(self.model.predict(state)) 39 | print("here") 40 | else: 41 | return np.argmax(self.model.predict(state)) 42 | 43 | def train(self): 44 | batch_size = self._batch_size 45 | x_batch, y_batch = [], [] 46 | 47 | np.random.shuffle(self.memory) 48 | 49 | batches = [] 50 | for i in range(0, len(self.memory), self._batch_size): 51 | batches.append(self.memory[i:i + self._batch_size]) 52 | 53 | for b in batches: 54 | 55 | for state, action, reward, next_state, done in b: 56 | y_target = self.model.predict(state) 57 | y_target[0][action] = reward if done else reward + self.gamma * np.max(self.model.predict(next_state)[0]) 58 | x_batch.append(state[0]) 59 | y_batch.append(y_target[0]) 60 | 61 | self.model.fit(np.array(x_batch), np.array(y_batch), batch_size=len(x_batch), verbose=0) 62 | 63 | if self.epsilon > self.epsilon_min: 64 | self.epsilon *= self.epsilon_decay 65 | self.memory = [] 66 | -------------------------------------------------------------------------------- /agent/stochastic_policy_gradient_agent.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | 4 | class StochasticPolicyGradientAgent(): 5 | """ 6 | A Gaussian Policy Gradient based agent implementation 7 | """ 8 | def __init__(self, env, learning_rate = 0.001, discount_rate = 0.99, batch_size = 1, quiet = True): 9 | 10 | self._optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate) 11 | self._sess = tf.Session() 12 | self._env = env 13 | self._batch_size = batch_size 14 | self._discount_rate = discount_rate 15 | self._state_buffer = [] 16 | self._reward_buffer = [] 17 | self._action_buffer = [] 18 | self._quiet = quiet 19 | 20 | state_dim = np.prod(np.array(env.observation_space.shape)) 21 | 22 | self._states = tf.placeholder(tf.float32, 23 | shape=(None, state_dim), 24 | name="states") 25 | 26 | 27 | init = tf.contrib.layers.xavier_initializer() 28 | 29 | # neural featurizer parameters 30 | h1 = 256 31 | h2 = 128 32 | h3 = 128 33 | 34 | mu_hidden = tf.layers.dense(self._states, h1, 35 | activation = tf.nn.tanh, 36 | name = 'dense_0', 37 | kernel_initializer=init) 38 | mu_hidden_2 = tf.layers.dense(mu_hidden, h2, 39 | activation = tf.nn.tanh, 40 | name = 'dense_1', 41 | kernel_initializer=init) 42 | mu_hidden_3 = tf.layers.dense(mu_hidden_2, h3, 43 | activation = tf.nn.tanh, 44 | name = 'dense_2', 45 | kernel_initializer=init) 46 | self._mu = tf.layers.dense(mu_hidden_3, 1, 47 | activation = tf.tanh, 48 | name = 'mu', 49 | kernel_initializer=init) 50 | self._mu = tf.squeeze(self._mu) 51 | 52 | 53 | # Building sigma Model 54 | 55 | sig_hidden = tf.layers.dense(self._states, h1, 56 | activation = tf.sigmoid, 57 | name = 'sigma_dense_0', 58 | kernel_initializer=init) 59 | sig_hidden_2 = tf.layers.dense(sig_hidden, h2, 60 | activation = tf.sigmoid, 61 | name = 'sig_dense_1', 62 | kernel_initializer=init) 63 | sig_hidden_3 = tf.layers.dense(sig_hidden_2, h3, 64 | activation = tf.sigmoid, 65 | name = 'sig_dense_2', 66 | kernel_initializer=init) 67 | self._sigma = tf.layers.dense(sig_hidden_3, 1, 68 | activation = tf.exp, 69 | name = 'sigma', 70 | kernel_initializer=init) 71 | self._sigma = tf.squeeze(self._sigma) 72 | self._sigma = tf.add(self._sigma, 1e-5) 73 | 74 | #Sampling action from distribuition 75 | 76 | self._normal_dist = tf.contrib.distributions.Normal(self._mu, self._sigma) 77 | self._action = self._normal_dist.sample() 78 | 79 | #Computing loss function 80 | 81 | self._discounted_rewards = tf.placeholder(tf.float32, (None, 1), name="discounted_rewards") 82 | self._taken_actions = tf.placeholder(tf.float32, (None, 1), name="taken_actions") 83 | 84 | self._loss = -tf.reduce_mean(tf.log(1e-5 + self._normal_dist.prob(self._taken_actions)) * self._discounted_rewards,0) 85 | 86 | 87 | self._train_op = self._optimizer.minimize(self._loss) 88 | 89 | self._sess.run(tf.global_variables_initializer()) 90 | 91 | def act(self, state): 92 | mu, sigma, action = self._sess.run([self._mu, self._sigma, self._action], feed_dict={ 93 | self._states: state}) 94 | action = np.clip(action, self._env.action_space.low[0], self._env.action_space.high[0]) 95 | 96 | if not self._quiet: 97 | print("Sigma: {}, Mu: {}, Action: {}".format(sigma, mu, action)) 98 | 99 | return action 100 | 101 | def train(self): 102 | rewards = self._discount_rewards().tolist() 103 | #rewards -= np.mean(rewards) 104 | rewards = [[r] for r in rewards] 105 | samples = [] 106 | for t in range(len(self._state_buffer)): 107 | samples.append([self._state_buffer[t], rewards[t], self._action_buffer[t]]) 108 | 109 | 110 | np.random.shuffle(samples) 111 | batches = [] 112 | for i in range(0, len(samples), self._batch_size): 113 | batches.append(samples[i:i + self._batch_size]) 114 | 115 | for b in range(len(batches)): 116 | batch = batches[b] 117 | states_batch = [row[0] for row in batch] 118 | actions_batch = [row[2] for row in batch] 119 | rewards_batch = [row[1] for row in batch] 120 | 121 | feed_dict={ 122 | self._states: states_batch, 123 | self._discounted_rewards: rewards_batch, 124 | self._taken_actions: actions_batch} 125 | self._sess.run([self._train_op], feed_dict=feed_dict) 126 | 127 | #After applying gradients 128 | self._state_buffer = [] 129 | self._reward_buffer = [] 130 | self._action_buffer = [] 131 | 132 | def store_step(self, action, state, reward): 133 | self._state_buffer.append(state) 134 | self._reward_buffer.append(np.array(reward)) 135 | self._action_buffer.append(np.array([action])) 136 | 137 | def _discount_rewards(self): 138 | r = 0 139 | N = len(self._reward_buffer) 140 | discounted_rewards = np.zeros(N) 141 | for t in reversed(range(N)): 142 | r = r + self._reward_buffer[t] * self._discount_rate 143 | discounted_rewards[t] = r 144 | return discounted_rewards -------------------------------------------------------------------------------- /data/ETH_USD_2016_2018_15min.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuilhermeGSousa/ml-stock-prediction/a143c683ec96721f7ff5a95004a70d3eda1c8fb4/data/ETH_USD_2016_2018_15min.pkl -------------------------------------------------------------------------------- /data/ETH_USD_2017_2018_15min.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuilhermeGSousa/ml-stock-prediction/a143c683ec96721f7ff5a95004a70d3eda1c8fb4/data/ETH_USD_2017_2018_15min.pkl -------------------------------------------------------------------------------- /data/train.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GuilhermeGSousa/ml-stock-prediction/a143c683ec96721f7ff5a95004a70d3eda1c8fb4/data/train.pkl -------------------------------------------------------------------------------- /environment_agent_debug.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "import pandas as pd\n", 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import tensorflow as tf\n", 21 | "\n", 22 | "import datetime\n", 23 | "\n", 24 | "import gym\n", 25 | "import trading_env\n", 26 | "\n", 27 | "import os\n", 28 | "import agent \n", 29 | "from os import __file__" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "Loading historical data file\n" 42 | ] 43 | } 44 | ], 45 | "source": [ 46 | "#env = gym.make('trading-v0')\n", 47 | "env_trading = gym.make('test_trading-v0')" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "Holder Agent\n", 55 | "--------------\n", 56 | "To begin a holder agent will run on the month of march 2017, which will provide a reference to compare future agents. The same could also be done with a random agent. A holder agent is equivalent to set the action to 1 at each step (selling 100% of the portfolio's fiat)." 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "date = datetime.datetime(2017, 5, 1, 0, 0)\n", 66 | "env_trading.reset(date=date)\n", 67 | "rewards = []\n", 68 | "portfolio = []\n", 69 | "while True:\n", 70 | " action = 1.0 #Holding\n", 71 | " s, r, done, _ = env_trading.step(action)\n", 72 | " rewards.append(r)\n", 73 | " portfolio.append(env_trading.portfolio_value)\n", 74 | " if done:\n", 75 | " break" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 4, 81 | "metadata": { 82 | "scrolled": true 83 | }, 84 | "outputs": [ 85 | { 86 | "data": { 87 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAD8CAYAAACRkhiPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xd4W+XZ+PHv7e3YSewkzrQTZ5E0\nCWTgTFYCNAMoYZWyyiYvoxRa3vILe1MKvLSllFAoFGiBAGU3jIQAZSbE2TsxZC87y7HjeMh+fn/o\nSD5atixblmTdn+vi4ujRkXwfyzm3ni3GGJRSSsWnhEgHoJRSKnI0CSilVBzTJKCUUnFMk4BSSsUx\nTQJKKRXHNAkopVQc0ySglFJxTJOAUkrFMU0CSikVx5IiHQBAly5dTH5+fqTDUEqpmLJ48eK9xpic\n5rxHVCSB/Px8CgsLIx2GUkrFFBHZ0tz30OYgpZSKY5oElFIqjmkSUEqpOKZJQCml4pgmAaWUimOa\nBJRSKo5pElBKqTimSUAppSKg2lHHG4XbqKuL7Ba/UTFZTCml4s2zX/7A43M3kJQgnDMqN2JxaE1A\nKaUioLisCoCPV+2OaByaBJRSKgL2lVcDMHfNnojGoUlAKaUioLKmFoAhPTpENA5NAkopFQFj+nYC\n4NqJ/SMahyYBpZSKgF2llQCM6p0V0Tg0CSilVAS8+O1mAFKSInsb1iSglFKtrNpR5z7umJ4cwUg0\nCSilVKurqa1PAqlJiRGMJIgkICJ5IvK5iKwRkdUicpNV/piIrBORFSLyjohk2V5zm4gUich6EZkS\nzgtQSqlY46iN7Cxhu2BqAg7gFmPMEGAccIOIDAHmAcOMMccAG4DbAKznLgCGAlOBp0UksqlOKaWi\niKOurvGTWkmjScAYs8sYs8Q6LgPWAr2MMXONMQ7rtAWAa97zdGC2MabKGLMJKALGtHzoSikVmxwR\nXi/Irkl9AiKSD4wEFno9dSXwkXXcC9hme267VaaUUgrPPoFICzoJiEgm8BZwszHmkK38DpxNRq80\n5QeLyAwRKRSRwpKSkqa8VCmlYlptrNUERCQZZwJ4xRjztq38cuAM4GJjjOuqdgB5tpfnWmUejDHP\nGmMKjDEFOTk5IYavlFLRbfXOUrbtr/Aoq4mljmEREeB5YK0x5glb+VTgVuBMY4z9Ct8HLhCRVBHp\nCwwEvm/ZsJVSKjac/uTXnPDo5x5l0dQxHMx+AscBvwRWisgyq+x24EkgFZjnzBMsMMZca4xZLSJv\nAGtwNhPdYIypbfnQlVJtTVFxGalJieR1ahfpUMLKNUT0knG9IxxJEEnAGPM1IH6e+rCB1zwEPNSM\nuJRScejUJ74EYPMjp0c4kvByjQ46eXDXCEeiM4aVUlHoux/2Ac4O1LcWb4+qjtSW4OojSEqI/C04\n8hEopZSX3YeOAPCPbzZxy5vLeWvx9ghH1LJufG0pEB2jhDQJKKWijusb8lbrG/OnayO7+1ao6gdN\n+r/hR8N8AU0CSqmo47o5VlQ7x5REegvGUJUeqXEfL95ywOf54wd2ac1w/NIkoJSKOq4k8MnqyG7C\n3lzbDxxxH1/90iKf59ulBDNAM7w0CSilok51rcEYQ1mlo/GTo1hJeZX7+FClg017D0cwGv80CSil\nok6No44/z9/oUVYXBZ2oTeWdxCY9/kVkAmmAJgGlVNRx1NXxp089k8DsRdsCnB29yiprGj8pwjQJ\nKKWign0kjb+1df61YEtrhtNsjto6/jhvY8DnL5+Q33rBNECTgFIqKtiHUNqbUfrlZACQlOhv4YLo\nNW/NHvba+gRcXLWDLpkprR2SX5oElFJRodK2+foS23DKXlnpACQmxFYSqAnQh1FUXA5A+7TIbjDv\noklAKRUVKmvq15n8fvN+AAr6ZLsXW0uKsSRgb96ycyWBDumRHx4KmgSUUlHCngRc7ps+1L3scqzV\nBOw54FeTBriPf/fvFQC0T9WagFJKuVXW+C6hkJ6cSJXVTBQNi601RXFZpfv4lslH8dWtkzyeb5+m\nNQGllHKrcvjWBNqlJDEyLwuA7Izo6EgN1sMfrnMfiwiZqZ43/Q7pWhNQSim3Kof/msAdpw8BoHOM\nJQGXSYOc2+cmeo1u0pqAUkrZVPlpDkpLSSAlKYFOGSlRtSVjMC4c49w17O+XjQZ8O7Zdo54iLZg9\nhvNE5HMRWSMiq0XkJqu8k4jME5GN1v+zrXIRkSdFpEhEVojIqHBfhFIq9rmag+yTqFKTEgHnDdQR\nRZuzByM5Uchql+zu0Pbu2La25Y24YGoCDuAWY8wQYBxwg4gMAWYC840xA4H51mOAaTg3lx8IzABm\ntXjUSqmY9u0Pezn1if96jAhydQyP7dvJ5/zkxAS/s4ijWW2dIdF2o0+Mkpu+t0aTgDFmlzFmiXVc\nBqwFegHTgZes014CzrKOpwMvG6cFQJaI9GjxyJVSMeue91ZTVFzu3jQG6lfc7N4xzef8hASoCzDu\nfv7aPezzMzM30uqMIcH27d9eE7jjtJ9EIiS/mtQnICL5wEhgIdDNGLPLemo30M067gXYV3rabpV5\nv9cMESkUkcKSkpImhq2UimWuJSLsN8Z1uw7RIS2J/M4ZPucnivjdmctRW8dVLxVy5lPfhC/YEDlq\njUc/gL3555oT+0UiJL+CTgIikgm8BdxsjDlkf844p8Y1qa5mjHnWGFNgjCnIyclpykuVUjGuxurk\ntX+5311aSV6ndqQk+d6WEhOEWj81AVcT0Y6DR3yei5RXF26luKySWmNIiNImILugxiiJSDLOBPCK\nMeZtq3iPiPQwxuyymnuKrfIdQJ7t5blWmVJKAbg7eV0jfpZsPcD8dcUcN6CzOwnkdaofPZOYINT6\n6ROoibIRQ7tKj3D7Oyt5c3EWS7ceJLtddMwFaEgwo4MEeB5Ya4x5wvbU+8Bl1vFlwHu28kutUULj\ngFJbs5FSSuGwmnZcyeCcp78FIKtdCsmJCfzlwpG8PmO8+/wEET5evZtl2w56vk+UdRav310GwNKt\nzjgPVET/fgLB1ASOA34JrBSRZVbZ7cAjwBsichWwBTjfeu5D4DSgCKgArmjRiJVSMc9h7SF8xl++\n9ihPttrQfza8p0e5q+/grL9+w+ZHTneXu/YiBthXXkXnzNSwxBus37y+rPGTokyjScAY8zUQqGHr\nFD/nG+CGZsallGrDqv3MDgb/m8lA4MXjjlTXDzG9+O8L+fjmE5sfXDNcPLYPT31e5H583cT+EYwm\nODpjWCnV6qpr/SeBM47xP5rc3id8yxvL3cfvL9/pPl5nNcVEUoJXsprQv3OEIgmeJgGlVKvz943/\nwjG9mXa0/yTgsA0PfWvJdvYcqsQYwxPzNrjLM1ISWz7QJnhr8XaenO+5neQJAz1HPqYlJwRMdJES\nHSsYKaXi3qa95QGf896gZd3uMtKtm35ep3Q6piezv7w6rPE15rP1xY2es+6Baa0QSdNoTUApFRVG\n5GUHfM57tnBmahIrtpUCcM0J/TgmNytgE1NribWdz1w0CSilWpW/HcQAfjm+T8DXeM8WdtTWuTds\nz+vUjpTEBL9LUbcmeyd1LNEkoJRqVSVl/tf5SW7gm7T3ZOFKR537m39edjqLNu+nrNLB1n0Vfl7d\nOlx7B/f0s/ZRNNMkoJRqVYcq/U+gSkoMfDvybg667IXvKat0AM7lplfvdK5ks3DTvhaKsumG9uoI\nwD1nDo1YDKHQJKCUalUVAZpNGtpI3nXDt1uy9QAAacn1o4LW7orcMNGMlES6dUhlytDuEYshFJoE\nlFKtyjsJ5LR3zvJNTw48xHPfYd+RP28vcS5Jlp6S6N6qsSZCncOLt+xn9qJtfhe/i3axF7FSKqZV\nVHl+q399xjj+etGokG+gaUkJXDDauWZlQ7WJcDp31ncAJCXE3i1V5wkopVrNu0t38OCctR5l/XIy\n6ZeTGfJ7JiUmMHPaT3juq00R37y9Wwdnreapi0bSvxnX1Jo0CSilWs3NXgus2ZeLbo7EBCElMcFj\nZnEk9OzovJ4zjunZyJnRQ5OAUioinrnkWEb1zmrWe9hXFE1M8L/7WGvKapcS0Z8fCk0CSqlW8eI3\nmzweTxnazWPLxaYa3L29x+OkBGl2x3CVo5ZBd34MwA8Pn9bkPoaO6dG/iYy32OvFUErFpHs/WOPx\nuCkJwN+pb18/weNxYmLzawJ7SusnsnlvYBOM4Xkdm/XzI0GTgFKqUZv2HmZXacvt4+saFhosVw64\n9qT69fnbpXg2ZCQlSLP7BFxzDwAqqn3nJgTSPyeDAV0zmTioa7N+fiQEs73kCyJSLCKrbGUjRGSB\niCwTkUIRGWOVi4g8KSJFIrJCREaFM3ilVOuY9PgXjP/9Z9z42lLyZ85p1ns9c8koFt7msx9Vg1y1\nhquO7xvwnL3l1by6cCtPzF0fcmwd0usTS6BJbf6UVToo6BN4AbxoFkxN4EVgqlfZo8B9xpgRwN3W\nY4BpwEDrvxnArJYJUykVDT6wbeLSFFUO5w21T+d2TB3Ww2fzlca4Tg+mBenJz4oaPymAI9X1fQqH\nq4KvCZRXOSI+PDVUwWwv+aWI5HsXAx2s446A6y9jOvCytcXkAhHJEpEeutG8Um3Lyu2lHJ0bfPv3\ntv3OpiTvNYCC5awJGBJEmPPr48lMDc8N177CaemR4DaJd9TWUVFdS2Zq7HUKQ+ijg24GPhGRx3HW\nJlw9NL2AbbbztltlmgSUikGfrdvj92a4s/RIk5KAo875DXvm1J+EFIerApAgMLRn+DpfKx31SeC+\nD9YwZWh3emYFnsuwakcpq3Y49zVoszWBAK4DfmOMeUtEzgeeB05tyhuIyAycTUb07t07xDCUUuF0\n5YuFfsub0lQC9WvttwtxC8gEqx1ICN+yEN8W7eWOd1Z5lH1dtJfzC/ICvuaMv3ztPs6M0SQQ6uig\ny4C3reM3gTHW8Q7A/hvLtcp8GGOeNcYUGGMKcnJy/J2ilIpSlTVNG49/xGpmSWtgkbiGuPsEgrhj\nZbcLrVnmor8v9Cm79d8rgn79ln2HQ/q5kRZqEtgJnGQdnwy4dld+H7jUGiU0DijV/gCl2p5Au4M1\ndn5zawLBOFBRw+lPfkXxocqQflaovIesxopghoi+BnwHDBKR7SJyFXAN8H8ishx4GKtZB/gQ+BEo\nAp4Drg9L1EqpiLK3nQfDNeomPcQk4GoFMg1UQJbe9VNSrI1pVu88xOxF2wKfHKTcbGd/QJWjlvyZ\nc8ifOQeHNSu52ms7y1+MDtxsFM2CGR10YYCnjvVzrgFuaG5QSqnoFmpzUEN7BjQkIyWJskoHhsCj\ni7IzUpg8tBv/WdFyjQ9dMp2T2tbvrt+sZvpfv2HOr0/g49W7Pc4N9doiTWcMK6WarKqJzUF/+Hgd\nAKnJod1yXpsxjt9NGdToAm3j+3cO6f0DcXVo22/wq3cewhjD81/96C579ZqxZIRp2Gq4aRJQSjVZ\nU/sEXJvL52Q2bbkIl75dMrhh0oBGz0u09R20xDiiXaVHuOTvC9l+0HPJjD2HqthZ6uxzKHpoGhP6\nd2mBnxYZsZm6lFIRdaSBJFB6pIa6OkN2Rv239pTEBH42vGezVg0Nhn0mcqg/Kr9zOzbvqwDgUKWD\nr4v2UuY1JLa4rNKd2JISY/u7dGxHr5SKiIb6BEbeP5eRD8xzPzbGUGeMe9etcLLXBMqrmlZbcan1\nM6t5j/Wt/7qJzgXsznzqGwAGdI2N3cMaoklAKdVkDTUHuRbyNNbN9FClA0edaZXJVPb1/5/57w9B\nv87YbvzGwMp7J3Pvz4a4y3Zbw02H53pugjNQk4BSqq0yDazzM3fNnkZf71qFc/h9cwH4sST8k6m2\n7a/wePzdD/soLmt8vsCeQ/X7CPTu1I72acm0T/OddJbfpZ3H40fOOSbESKOHJgGllF+Nrc2/ae9h\nyhtYPuKJeRsorahfd+gnPToEPLeleO8sduFzCzj7r982+rq95c4kMLZvJ566yLkCvr9dxbyHgXYM\ncXZyNNGOYaWUX/bJUMNzO7J8e6nH85Me/4J+XTIY2C2Tc0flMnlod4/nn/96E2t3HXI/vmhM+NcI\nS/UzVn/HwcY3w3F1dN948kA6WR3aByqqfc6zT3Yb169TqGFGFa0JKKX8sieBveW+N0SAH/ce5pPV\ne5jxz8V+n7d/cw55tnATpCaFdktzLYhnj3Hhj/t9zrNfz9MX+8yXjUmaBJRSftmbVhpaSdOlcLPz\nptk/J8NdNn9dMQCbHzm9haNrWa5JYRmp9Tf5FD8JxbU+UEpSgrvGEOs0CSilfBRu3s+Yh+e7Hycn\niXs45Kk/8b+P7nnPfAf4rhTavUNamKL0Feo8hMOupa6T61vI/SWBxAThxpMH8LdL2kYtADQJKKX8\nmLPSc/2d9mnJ1FkdxQO6tm/wtVu9Rui4Ol1bQ7ApoPhQJSttfRxHrE3l29lqAn27ZHi85pyRvQC4\nZfIgJg2OvQ3lA9EkoJTykew1C/bnx+a6J1EFWihtTN9O3Pv+asoqPUcMhdpOH04nPfYFP3uqfkOY\nw342vfmfE/u5j9c9MJXHfj689QJsRdH36SilIq7Oa3hoUoK49wdOT/F/2/h+035e/Haz+/GTF44E\n4Pog1vxpKYFag7yvxzUaqMpRyw8l5TzykXOBu7Sk+iTgWg6iQ1oSacmJfoeMtgU6RFQp5cN76QQR\n4YxjejLrix/o5tXGL+KcZWuX0z6VM4f3ZPKQbq1aEwh0m65y1PkdnTTozo/53ZRB7scJXjf6+bec\nRAc/k8baEq0JKKV8eN/UBfjd5EGsuHeyz0qgxw/wXUHzzxeMAJydxOFeNM4u0M9qaJmLz6wRTP70\nz8kkp3341zyKpGB2FntBRIpFZJVX+Y0isk5EVovIo7by20SkSETWi8iUcAStlAqv2jrvmoDzW3KH\ntGSfPQG+2rjX5/Uj87LDGl9TufYz8Gel1yS4eBNMTeBFYKq9QEQmAdOB4caYocDjVvkQ4AJgqPWa\np0UkNrfbUSqO1flpDnLp2r7xIZ9pIW4e01xjA8zibWirSVdzVagb1Me6Rj8pY8yXgPfUueuAR4wx\nVdY5rvrUdGC2MabKGLMJ517DY1owXqVUK7AngXm/OdHjucba+P/4i+Gt2gRkN7i75/pEl43v0+hr\nkhKdsX52y8RwhBT1Qk3XRwEniMhCEfmviIy2ynsB9pS73SpTSsWQOts6bN5r5vsbJfPLcfU327NH\n5oYtrqZYctdPGduv8e0ma2qdCa9DutYEmiIJ6ASMA34HvCFNTP0iMkNECkWksKSkJMQwlFLhYB8d\n5P1P2zsJjO3bif+d7Bxh0ysrPfzBBSk9OZFAozrtzVWHqx0kiP/kFg9CTQLbgbeN0/dAHdAF2AHY\nFxnJtcp8GGOeNcYUGGMKcnJyQgxDKRUO3n0Cdt43y/5dM+nYLpn7pw9l9oxx4Q4taCK+y2HvKj3C\nB8t3ktM+lekjegLOkVD+loiIF6HOE3gXmAR8LiJHASnAXuB94FUReQLoCQwEvm+JQJVSrWPVjlLe\nXuL87uZvDwDvJOB6dOn4/DBH1jQJIkwc5FzewbUExAXPLmDLvgq6ZKaSmpTgnuOQEuP7BDdHo0lA\nRF4DJgJdRGQ7cA/wAvCCNWy0GrjMOLchWi0ibwBrAAdwgzEmtI0+lVIR8eT8je5jf9/svZNAMKOF\nIiFBIDM1iXH9Orn7OHZaewtUOWpJTkxwz4c4VBl4c5y2rtEkYIy5MMBTlwQ4/yHgoeYEpZSKHHsH\naUc/naX2zdzPL8jl+kn9WyWupnL1ZdTWGRZtPuAsQwBDlaPOZ32keKW/BaWUh/aNbAhvrwmcX5AX\ntTdTV5iuBHCwotrddlXtqCM5MT47gr1F56enlIqYxEYG+tlHCyVFaQIA31FNNbXGY7c0e/K678yh\nrRZXtIneT1ApFfWSYmhYpcFrZVRbEmjr6wM1RJOAUspD4MGhvpJiqEnFUet5ZfYaT6SWuYgG8Xvl\nSim/Gpgi4CMpIfpvIdec0BfwTQIVNfUjgiqq43cQY/R/gkqpVuXdbNKQWGgOGtarIwAbi8sCzgru\nn5PptzweaBJQSnmorHF2ngazGUwsNAe5OoCveqmQU2x7A9v3QcjvnOHzunihSUAp5cG16Xow3/Jj\noTnIfh1dOzg7gF++cgwnDKxfrkb7BJRSCiguq+TdZTsB57ILjYmlmoBL54wUTjzKmQCG9XIuixGp\npa+jge4xrJRy+9WrS93H3vvt+hMLfQL2RLXwx/0eN/zXZ4znUGVNJMKKGloTUEq5rd15yH0czNLK\n0TxZzMXeZLWxuNxjpnBGahI9OkbP8teREP2foFKq1QzpWb9q6CtXj230/GisCHgvB+H9OF73DQhE\nm4OUUm77D1cD8Nh5x/hdRtpbWlL0bSH++f9OZOv+Cvdj79pKtK51FCmaBJRSAOwurWRjcTnXTezP\nzwvyGn8BwfUbtLbc7HbkZrdzP9aaQMM0CSil2LqvgsfnrgfqN2BpK7y/+cdCZ3Zr0iSglOKS5xe6\nm1DGB7E5eyzxvulrc5An/W0opeiQXv99sHNmSgQjaXneN31tDvLUaBIQkRdEpNjaStL7uVtExIhI\nF+uxiMiTIlIkIitEZFQ4glZKtSzXUhEA7VLaVgOB94Q23UzGUzA1gReBqd6FIpIHTAa22oqn4dxc\nfiAwA5jV/BCVUuFUVllDUXF5pMMIG++lLbQm4KnRJGCM+RLY7+epPwK34rn8+HTgZeO0AMgSkR4t\nEqlSKiye/uKHSIcQVr7zBrQV3C6kep+ITAd2GGOWe6250QvYZnu83Srb5ec9ZuCsLdC7d+9QwlBK\nNcO/FmzhDx+to6yqfl394XlZQb32uAGd+bHkcLhCa1E6OqhhTU4CItIOuB1nU1DIjDHPAs8CFBQU\nNGUzI6VUC7jzXc9uviuP68utUwcF9dpXrh4XjpDCwrtPIDEGVj5tTaHUBPoDfQFXLSAXWCIiY4Ad\ngH2WSa5VppSKcrdMPoq05OibAdxcyV43/TU7SyMUSXRqcko0xqw0xnQ1xuQbY/JxNvmMMsbsBt4H\nLrVGCY0DSo0xPk1BSqno0jE9mYzUtjUqyMV7VvPO0soIRRKdghki+hrwHTBIRLaLyFUNnP4h8CNQ\nBDwHXN8iUSqlwqr0SHwvpxzPGk39xpgLG3k+33ZsgBuaH5ZSqjVNH9Ez0iGoCNEeEqUUnTLa1ixh\nFTxNAkrFofeWeY7X6J+TGaFIWscnN58Y6RCiliYBpeLQTbOXeTy+eGzbnqszqHt7UnSSmF/6W1Eq\nztTU1vmUxcNG6+kpbW/4a0vQJKBUnKmsqY10CBGRlqy3O3/0t6JUnLGvGBpP2uJEuJagSUCpOONd\nE3jgrGERiqR1ReN+yNGgbU4RVCpOFBWXk5OZyo97yxnWq2NQK2RWOZxJoHuHNL6ZeXLcLK2ckepM\nAqcfrQsb22kSUCpGvfTtZu55f7X78dXH9+XOM4Y0+jpXc9B904fGTQIASLVqAhe18ZFQTaXNQUrF\nKHsCAFi02Xfbj7o6w8Y9ZR5lh62lozPb6FpBgbgSXp3RRYvt4uuvQKk25ISBXfhq41734+4d0zye\nv/6VxXy4cjfgvOEvuuNU0lMSKbeSQLs4GzLpGgVbpznAg9YElIpR3pujfLJ6D/kz5/DMf507hbkS\nAEB5lYPTnvyK0ooatuyrACA3u13rBRsFXHMhjNYEPGhNQKkY5bB9pU1PTuSINernkY/W8fTnRT7n\nb9p7mOH3zwWcTSNdMuNrvSBXytQc4ElrAkrFqCpH/Xj/I17DPg9V1m8ZefrRPXza/++fPjQuZgnb\nuSpOBs0CdpoElIpRZbYbfaB1cc4vyOXhs4929wMAvHjFaC4e2yfs8UUbV9Kri8+5cgFpElAqRu08\neMR9/Pr/+N/z99HzhtOxXTJnDq/fL2DioK5hjy0a1dcElF0wO4u9ICLFIrLKVvaYiKwTkRUi8o6I\nZNmeu01EikRkvYhMCVfgSsWzakcdpUdqGNy9PfN+cyJdO9SPDJp18SheuLyAVffV//O7bEI+AP9z\nYr/WDjVquGsC2ingIZiawIvAVK+yecAwY8wxwAbgNgARGQJcAAy1XvO0iMTXODSlWoFrrP/5BXkM\n7NaezrZNYaYd3YOTB3fz6Ac4tk82r14zllsmD2r1WKNFfcewJgG7RpOAMeZLYL9X2VxjjKuRcQGQ\nax1PB2YbY6qMMZtw7jU8pgXjVUqBu40/M815o09LTuSUwV15+uJRAV8zoX8XUpLitwW4b5cMALLb\nxdeoqMa0xBDRK4HXreNeOJOCy3arTCnVQtbuOsQ5T38LeM76ff7y0ZEKKSb875RBjOvXmbH9Okc6\nlKjSrK8FInIH4ABeCeG1M0SkUEQKS0pKmhOGUnHlb//9wT0k1PXtVjUuOTGBSYPjs1O8ISEnARG5\nHDgDuNjUN7LtAPJsp+VaZT6MMc8aYwqMMQU5OTmhhqFU3KmprW/THtStfQQjUW1BSElARKYCtwJn\nGmMqbE+9D1wgIqki0hcYCHzf/DCVUi6rdpa6jxPiaBVQFR6N9gmIyGvARKCLiGwH7sE5GigVmGcN\nu1pgjLnWGLNaRN4A1uBsJrrBGBOfe9kpFQaO2jr32j9KtYRGk4Ax5kI/xc83cP5DwEPNCUop5V9J\neZX7+O4g9g5QqjHxO15MqRi0q7QSgDOO6cGVx/eNcDSqLdBVRJWKAcVllTwxdwOzF20D4MaTB0Y4\nItVWaBJQKsqVVdYw5qH5HmUDu2ZGKBrV1mhzkFJRbs6KXT5lOipItRRNAkpFOe+Vbp67tCAicai2\nSZOAUlHO+0v/T4d0i0wgqk3SJKBUlKuu1VUvVfhoElAqyu2zzQ0ItIOYUqHS0UFKRbmdB4/QMT2Z\nCf07c9HY3pEOR7UxmgSUinLlVQ5y2qcy65JjIx2KaoO0bqlUlCo+VMm8NXv4cOVu0pL1n6oKD60J\nKBWlxjxcP0Fs1Y5DEYxEtWX69UKpGNAlU7dEVOGhSUCpKJWcWD9BYOHtp0YwEtWWaRJQKkoN7Fq/\na1iiLhOhwkSTgFJRas0u7QdQ4ddoEhCRF0SkWERW2co6icg8Edlo/T/bKhcReVJEikRkhYiMCmfw\nSrVVR6rrN+T74FfHRzAS1dbiK09rAAAVE0lEQVQFUxN4EZjqVTYTmG+MGQjMtx4DTMO5r/BAYAYw\nq2XCVCq+lFXVAPDA9KEcndsxwtGotqzRJGCM+RLY71U8HXjJOn4JOMtW/rJxWgBkiUiPlgpWqXhR\nXukAoH1acoQjUW1dqH0C3YwxrkXOdwOuZQ17Adts5223ypRSTVBe5UwCmak6lUeFV7M7ho0xBt8l\nzxslIjNEpFBECktKSpobRsz4oaScb4r2RjoMFeXqawKaBFR4hfoXtkdEehhjdlnNPcVW+Q4gz3Ze\nrlXmwxjzLPAsQEFBQZteK9dRW8fIB+ZRZv3DBtjw4DRSknRwlvKvzFUT0CSgwizUu9D7wGXW8WXA\ne7byS61RQuOAUluzUdzavO+wRwIAOOrOj3h7yfYWef+6OsOOg0f4dM0eznn6G2rr2nROjQvumkCq\n9gmo8Gr0a4aIvAZMBLqIyHbgHuAR4A0RuQrYApxvnf4hcBpQBFQAV4Qh5phy42tL+WD5Tr/P/faN\n5RyTm8WAZm4a/vJ3m7n3gzXux/1v/5CV907WTsUYdsubywGtCajwC2Z00IXGmB7GmGRjTK4x5nlj\nzD5jzCnGmIHGmFONMfutc40x5gZjTH9jzNHGmMLwX0L0Kty83yMBrLl/Cpt+fxpDenRwlz3/9Y9N\nes9L/r6Q/JlzqKypxdkdA699v83nvKPvnRti1CqS9h+u5qOV9ZXn7HaayFV46deMMHpl4VaPx+1S\nnL/uD286gYpqB0Pu/oRk205R+TPnIAKbfn+6u+ypzzZy6pBuDO7egR0Hj/C11ak8+K6PfX7er08e\nwLj+nbnouYUA1NTWeby/in7nPP0Nm/dVuB+L6HIRKrz0DhFGXdunuo//ddVYj+dcCeHl77ZQVFzG\n45+sB8AYKHhwHsYYNu09zONzNzD1T19x0+ylHPfIZwF/1pvXjue3kwcxoX8X90bkry/aRuFm7yke\nytviLfvJnzmHaX/+ilU7Slvt5zpq6yitqHE/3rz3sEcCePWasf5eplSL0ppAmNTWGbp2SANg+d2T\n6dhAtf6JeRv4cOVu9+O95dX0ve1Dj3PeW1bfrPTO9RPonJFKj6w0Ssqq6NYhzWOBsfML8pi3Zg93\nvutc6eOPvxjO2SNzW+S62qJzZ30HwNpdh7j9nZW830rLNNz61greXrKDV68Zy7F9sinccsD93Ph+\nnRnfr3OrxKHimyaBMCg+VOmxIUhqI7tCFRWXu4/fuX4CZz/9rd/zPvjV8Qzq3t5jaGnPrHSf84b1\n6uDx+DevL9ckEKTVOw9hjAl7M0xtneHtJc7R067mO5cfHj5NVw1VrUabg1pYtaOOn//tO/fjlMQE\nUhuZD7BhT30SGNk72+O5X58ykGtP6k/hnadydG7HoOYWZLfz3YDkgme/o8pR6+fs5nF1TrcVtXWG\nAXd8RPGhSgD++nkR+TPnsHjLfg5XORp5dfDeLPTtzHfRBKBak9YEWthTnxexxdaum52R3ORvlbNn\njGN3aSXTR/QM6RtpWnIis2eM44JnF7jLFvy4n0F3fszMaYN55KN17vLNj5zu7y2CUuWoZdCdHzN5\nSDeevbSgwXMPHK6mQ3pyVN3gqhy1vLfU2cx248kD+MtnRYAzEZz+l6/5+bG5PP3FD0B9k9HArpnM\n/c2Jza4pHKnxn5B1xVDV2rQm0MJWbj/o8biiOvhv3//93UQAxvXrzFkjezXrRjOuX2c+uflEn5uu\nPQGAc0TSlD9+2eRv9DW1dQy60zlCae6aPbzqNRLKxRjDE/M2MPKBefS//cOAE9mqHXV8uaGEe99f\njaO2rkmxhMIYw6A7P+bWt1YA+MzVKCmrcicAu43F5fS97UNmf+//eoPl+j08f5ln8tQVQ1Vr05pA\nC3n+60088J81dLAm93TrkMqeQ1XkZrcL6vUvXF5An84ZLRrToO7tmf/bk5j4+BcNnrd+TxmPfLSO\n2077SaPvaYzBGPh0zR6P8tvfWcnt76zkq1sn8cWGEh78zxq+u+0UvtxQwpPzN7rPe2vxds4fnefx\n2uMe+YwdB4+4H7/47WYuGtubh88+Ooir9O/J+Rt5Yt4G9+Orj+/LnWcM4U+fbuDpz3+g2pZozjs2\nlzOH92TK0O7sLa/isU/Wuzvi++dk8OIVY0hJSiApQTj2wU8BmPn2Sob27MjSbQdISUzggjG9PX5+\nWWUN6cmJJAUYovvgnLUAnHRUDovuOJVdpUcoPVLj91ylwkmioU23oKDAFBbG9ryy/Jlz3MfThnXn\n6hP6cu6s7xiRl8W7NxzX6GuW3PVTOmW0/Gbiu0qPMP73zqGl7dOS3MtXvHjFaC7/xyKPcxtqGtp/\nuJpOGSmc9ddvWLbtYMDzOmWksP9wtftxSlIC1Q7Pb/brH5xKalIijto6Pl1bzLX/Wuz3vX5z6lFc\neXx+0DOfqx11/PHTDczy8w3en6O6ZfLSlWPo0dG3c70hYx76lOKyKo+yF68YzcRBXYH6ZrILx+Tx\n+3OO8fsers++Oc1xSonIYmNMw22xjdCaQDPtLa/iKast2WXSoK4kWE056cmJAV+75K6fAoTl5u9i\nnyz2zCXHcvHfnSNRJg7qyqBu7Vm/p8z9fGVNLWl+4t26r4ITH/vc7/tfN7G/x03XngAAdwJYdd8U\nPli+k9veXuluRvL21EUjueWN5VRZr/njpxs4XO3gdq8ayj+/28xd763m/ulD+eW4PogIOw8eYYLX\nPIr/3Hg8G4vL+KZoH/9eXL9O04T+nbn7Z0MY3N1zFFWwHvv5cC574XuPMntCveK4fMA5kzsxQbj7\njKHuDv3tByqYu9pZi7ryuL4h/XylWpImgWYqsJoH7M4fnUdtneGaE/pyeQP/0MN583fpkpnKc5cW\nMKZvJ3dTlcsnvzkRgFcWbuGOd1Zx7qxvOWtEL645sR+HqxzsLa+iT+cMXvhmk9/3fvGK0RTkd2J4\nbhZThnbzmNsw6+JRXPfKEgBOHtyVzNQkxvTt5Pd9fjqkG7MuHkVSYgInHpWDqYOS8ip+/sy3LLJN\ndjtwuJorX1rE0q3Omsjd760mNSmB8wvyuMKrVrP0rp+SnZHCsF4dOXtkLlv2HWbR5gPc+7MhDX4m\nwTjpqBxOOiqH8f07c96xuT5/A//4ZrP7+F8LtvKvBVu5ZFxv7jtzGD9/5jt2lTpHHt10ysBmxaFU\nS9DmoGayN+k8et4xHNsnm/45zVsQLpz8NUOs313GlD996X68+ZHTmfFyIXPX7OHmUwfyp083+ryP\nv2YM++9i0+9P4xd/W8CSrQfY+NA0dyf34SoHyYkJvFG4jQn9O5PTPjVgc8/Ns5fy7rKdnHRUDn++\nYAT3f7CGt5c6x9YP69WBVTs8N2I/Jrcjr1w9ttUXznt14VZuf2dlk14zbVh3Zl1ybJgiUvFCm4Mi\nrNIa5jeydxZvXTuBhCga/hjIm9eO91iqAJxt495cG9/4SwB3nu6/A3ndA1P56+dFXH1CP0SEN64d\n73NOhrVT1iXj+jQa6wErzv9uKGHE/fOw/3pfuWocIx6Yi/07zF8uHBmRlVMvGtubNbtK+deCrQzP\ny2LrvsO8dd0EemWnIwi7So9w0mNfuM//xxWjKeiTHfgNlWpFMT9EtK7OMPOtFVz90iL3za22zvDV\nxvDvVuZq/z6/IC8mEgDA6PxOnDqkm0eZiPCm7YZdW2fI6+Q5qumbmSfz6LnH8OPDp3H1Cf38vnda\nciK3TB5Ex/SWuREfqvRMVq7Rpf+4fDQd2yXzh3Odna4Dumby6tVjW3x0VVP0ynL+vgr6ZLP07sn0\ny8kkNSmRlKQE+nTO4OObT2Bozw6cX5DLpEFddZlvFTViuiZQW2eYvWgrsxc5Z19e+NwCPrzpBPrf\n7mybnj1jHOPCuP6KKwn4m6Ebawr6ZLuHtR6sqGbd7voO424dUumVle4ztDPcKmucHcSn/qQrn651\nbl4nApMGO0fhnF+Qx/QRPUlNCtz53lpyrMUC95ZX+X1+cPcOzPn1Ca0ZklJBiemawH9W7OSOd1a5\nH6/ZdYjFtkW4vIcmtrSl1lDJtrDmu4i4R+F87bUH8sLbT41ESO5lLm6dOthd5t3fEg0JAOqTQEmZ\n/ySgVLSK6STgb3TNubPqF19z1NUngXeWbid/5hy27a/weU2oyqzmikHd27fYe0aS6/d50+xlgHN/\ngm9mnhyxeKqsmoB9mO17AeZcRNqxfbLplZXOr3XEj4oxzUoCIvIbEVktIqtE5DURSRORviKyUESK\nROR1EQlbW4k9Cbxyte/a64er6pdsePwT5+zREx79nIrq5i0EVldnWL+7zD0UMKsNNAeBb7PWsF4d\n6eVnldLW4hpt1b1jGvNvOYmv/98kd8dytMlMTeKbmSeHtflRqXAIOQmISC/g10CBMWYYkAhcAPwB\n+KMxZgBwALiqJQL1x9UReNrR3TluQBfW3j/V4/mDFc42e2OMx7IE/1mxi6Zau+sQ71rDE//25Y9M\n+dOXba7q773aaXpKZJtajhvQhbeum0ByYgL9czKDXoJDKRW85n6tSgLSRaQGaAfsAk4GLrKefwm4\nF5jVzJ/jV2Zqksd49fSURP5x+Wi2Hajg7vdWc9d7q/nl+HyPzTrA92YXjGl//gpwrt//h4/rF2Fr\nSxt/eC821yUzNcCZSqm2IuSagDFmB/A4sBXnzb8UWAwcNMa42lu2A738vV5EZohIoYgUlpS03HDO\nSYO7csHo+sW8qh117lE8J1ujSm6avcw9xv/Nwm28vWQ7/1qwJeB7VtqW/T3f2itg2rDubHhwGq/N\nGNdisUeafYmJjJREftIjtGUVlFKxoznNQdnAdKAv0BPIAKY2+CIbY8yzxpgCY0xBTk5OqGH4Zd94\n5ag7P+LG15YC8NDZw9zlg+/6mH9+t5nf/XsFv31jOXe+u4r8mXNYs9M5C/X7TfuprKnlx5JyfvvG\nMp+f8ci5xwS1wUsssc91GKwJQKm40JzmoFOBTcaYEgAReRs4DsgSkSSrNpAL7Gh+mM3jGirarX2a\nR/ld7632Ofe0J7/igbOGcde7q3yec3nn+gktNiEqmtjX8Y+RuW9KqWZqThLYCowTkXbAEeAUoBD4\nHDgPmA1cBrzX3CBbwuDu7UlIEJbfM5lHPlrLa9/Xb+/36LnHcOaInox+8FPKqhx+E8C3M08mKVHo\nnJEaVbtjtSR7H4D2BygVH5rTJ7AQ+DewBFhpvdezwP8DfisiRUBn4PkWiLPJ/nLhSI/Hrg1TOqYn\nU9CnfjXLZy45lvNH55GWnMiyeya7y0WcQ1AvG9+HHx4+jZ5Z6XRtn9ZmEwA41/XZ9PvTuPdnQ/j9\nOaFv6KKUih3NGh1kjLkHuMer+EdgTHPetyV4t9cn2rZqnHZ0d177fitThnZn6rDu9eckCH/6xQhm\nL9rKa9eMa/Y+srFIRJq91LJSKnZE58ybFuDa1GVEXhbj+nVmXL/6b//tUpL493UT/L7urJG9OGuk\n3wFNSinV5rTZJOCqCfTMSmPmtMGNnK2UUvGpzSaB4wd04fqJ/bnyeG3aUEqpQNpsEkhMEI/VJ5VS\nSvlqW7OdlFJKNYkmAaWUimOaBJRSKo5pElBKqTimSUAppeKYJgGllIpjmgSUUiqOaRJQSqk4JsaY\nSMeAiJQAgbf2algXYG8LhhMN9Jpig15TbGjL19THGNOsXbmiIgk0h4gUGmMKIh1HS9Jrig16TbFB\nr6lh2hyklFJxTJOAUkrFsbaQBJ6NdABhoNcUG/SaYoNeUwNivk9AKaVU6NpCTUAppVSIYjoJiMhU\nEVkvIkUiMjPS8TSFiGwWkZUiskxECq2yTiIyT0Q2Wv/PtspFRJ60rnOFiIyKbPROIvKCiBSLyCpb\nWZOvQUQus87fKCKXReJarDj8Xc+9IrLD+pyWichptudus65nvYhMsZVHzd+liOSJyOciskZEVovI\nTVZ5LH9Oga4pZj8rEUkTke9FZLl1TfdZ5X1FZKEV3+sikmKVp1qPi6zn823v5fdaAzLGxOR/QCLw\nA9APSAGWA0MiHVcT4t8MdPEqexSYaR3PBP5gHZ8GfAQIMA5YGOn4rbhOBEYBq0K9BqAT8KP1/2zr\nODuKrude4H/9nDvE+ptLBfpaf4uJ0fZ3CfQARlnH7YENVuyx/DkFuqaY/ays33emdZwMLLR+/28A\nF1jlzwDXWcfXA89YxxcArzd0rQ397FiuCYwBiowxPxpjqoHZwPQIx9Rc04GXrOOXgLNs5S8bpwVA\nloj0iESAdsaYL4H9XsVNvYYpwDxjzH5jzAFgHjA1/NH7CnA9gUwHZhtjqowxm4AinH+TUfV3aYzZ\nZYxZYh2XAWuBXsT25xTomgKJ+s/K+n2XWw+Trf8McDLwb6vc+3NyfX7/Bk4RESHwtQYUy0mgF7DN\n9ng7Df8hRBsDzBWRxSIywyrrZozZZR3vBrpZx7F0rU29hli4tl9ZTSMvuJpNiMHrsZoMRuL8ltkm\nPieva4IY/qxEJFFElgHFOJPsD8BBY4zDT3zu2K3nS4HOhHBNsZwEYt3xxphRwDTgBhE50f6kcdbt\nYnroVlu4BmAW0B8YAewC/i+y4YRGRDKBt4CbjTGH7M/F6ufk55pi+rMyxtQaY0YAuTi/vbfKJumx\nnAR2AHm2x7lWWUwwxuyw/l8MvIPzQ9/jauax/l9snR5L19rUa4jqazPG7LH+cdYBz1FftY6Z6xGR\nZJw3y1eMMW9bxTH9Ofm7prbwWQEYYw4CnwPjcTbHJVlP2eNzx2493xHYRwjXFMtJYBEw0Oo9T8HZ\nOfJ+hGMKiohkiEh71zEwGViFM37XqIvLgPes4/eBS62RG+OAUltVPto09Ro+ASaLSLZVfZ9slUUF\nr76Xs3F+TuC8ngusURp9gYHA90TZ36XVTvw8sNYY84TtqZj9nAJdUyx/ViKSIyJZ1nE68FOcfR2f\nA+dZp3l/Tq7P7zzgM6tGF+haA4tET3hL/YdzJMMGnG1nd0Q6nibE3Q9nD/5yYLUrdpxtevOBjcCn\nQCdTP3Lgr9Z1rgQKIn0NVlyv4ax21+Bse7wqlGsArsTZgVUEXBFl1/NPK94V1j+wHrbz77CuZz0w\nLRr/LoHjcTb1rACWWf+dFuOfU6BritnPCjgGWGrFvgq42yrvh/MmXgS8CaRa5WnW4yLr+X6NXWug\n/3TGsFJKxbFYbg5SSinVTJoElFIqjmkSUEqpOKZJQCml4pgmAaWUimOaBJRSKo5pElBKqTimSUAp\npeLY/wcz5YhVqAH9oQAAAABJRU5ErkJggg==\n", 88 | "text/plain": [ 89 | "" 90 | ] 91 | }, 92 | "metadata": {}, 93 | "output_type": "display_data" 94 | } 95 | ], 96 | "source": [ 97 | "plt.plot(portfolio)\n", 98 | "plt.show()" 99 | ] 100 | } 101 | ], 102 | "metadata": { 103 | "kernelspec": { 104 | "display_name": "Python 3", 105 | "language": "python", 106 | "name": "python3" 107 | }, 108 | "language_info": { 109 | "codemirror_mode": { 110 | "name": "ipython", 111 | "version": 3 112 | }, 113 | "file_extension": ".py", 114 | "mimetype": "text/x-python", 115 | "name": "python", 116 | "nbconvert_exporter": "python", 117 | "pygments_lexer": "ipython3", 118 | "version": "3.5.2" 119 | } 120 | }, 121 | "nbformat": 4, 122 | "nbformat_minor": 2 123 | } 124 | -------------------------------------------------------------------------------- /gdax_client.py: -------------------------------------------------------------------------------- 1 | import gdax 2 | 3 | import pandas as pd 4 | import numpy as np 5 | 6 | import time 7 | import datetime 8 | 9 | class GdaxClient: 10 | 11 | def __init__(self): 12 | self.public_client = gdax.PublicClient() 13 | self.max_dataframe_size = 300 14 | self.req_per_sec = 2 15 | 16 | def get_historical_data(self, begin, end, granularity = 900, pair = 'ETH-USD'): 17 | """ 18 | Use UTC time 19 | """ 20 | 21 | if(end > datetime.datetime.utcnow()): 22 | raise ValueError("End date can't be set in the future") 23 | 24 | dt = datetime.timedelta(minutes=granularity/60 * self.max_dataframe_size) 25 | current_time = begin 26 | df_year = pd.DataFrame() 27 | 28 | # These transformations must be done due to limitations of the gdax api 29 | # If the time is not rounded down to the nearest granularity value, 30 | # the api returns more data than needed (eg. 351 rows for a difference between end and start of the granularity) 31 | begin = self._round_time(begin, granularity) 32 | end = self._round_time(end, granularity) 33 | 34 | while(current_time < end): 35 | if(current_time + dt < end): 36 | data = self.public_client.get_product_historic_rates(pair, 37 | start = current_time, 38 | end = current_time + dt, 39 | granularity=granularity) 40 | current_time += dt 41 | elif(current_time + dt >= end): 42 | data = self.public_client.get_product_historic_rates(pair, 43 | start = current_time, 44 | end = end, 45 | granularity=granularity) 46 | current_time = end 47 | if(data and not isinstance(data,dict)): 48 | df = pd.DataFrame(data, columns=['time','low','high','open', 'close', 'volume']) 49 | df.time = pd.to_datetime(df['time'], unit='s') 50 | df=df.iloc[::-1].reset_index(drop=True) 51 | df_year = df_year.append(df) 52 | 53 | time.sleep(1/self.req_per_sec) 54 | df_year = df_year.reset_index(drop=True) 55 | return df_year 56 | 57 | def get_market_price(self): 58 | public_client = gdax.PublicClient() 59 | data = public_client.get_product_historic_rates('ETH-EUR', granularity=60) 60 | df = pd.DataFrame(data, columns=['time','low','high','open', 'close', 'volume']) 61 | return df["close"][0] 62 | 63 | def _round_time(self, dt, granularity): 64 | rounded_time = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, 65 | granularity // 60 *(dt.minute // 15)) 66 | return rounded_time -------------------------------------------------------------------------------- /get_gdax_data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd\n", 10 | "import numpy as np\n", 11 | "from os import path as os_path, getcwd\n", 12 | "from sys import path as sys_path\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "\n", 15 | "\n", 16 | "import datetime\n", 17 | "\n", 18 | "import gdax\n", 19 | "\n", 20 | "from gdax_client import GdaxClient " 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 7, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "max_requests = 350\n", 30 | "dt = datetime.timedelta(minutes=15*max_requests)\n", 31 | "begin = datetime.datetime(2016, 1, 1, 0, 0) # Change begin date (YYYY/DD/MM/h/min)\n", 32 | "end = datetime.datetime(2018, 1, 1, 0, 0) # Change end date\n", 33 | "\n", 34 | "client = GdaxClient()" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 8, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "data": { 44 | "text/html": [ 45 | "
\n", 46 | "\n", 59 | "\n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | "
timelowhighopenclosevolume
02016-05-18 00:00:0012.5012.5012.5012.500.399002
12016-05-18 00:15:0012.5013.0012.5013.000.790428
22016-05-18 00:30:0012.7513.0012.7513.006.310570
32016-05-18 00:45:0013.0014.9314.9313.000.502848
42016-05-18 01:00:0014.0014.0014.0014.000.462483
52016-05-18 01:15:0014.0014.1014.0014.1015.000000
62016-05-18 02:00:0014.0014.0014.0014.000.052000
72016-05-18 17:15:0013.6013.6013.6013.600.366730
82016-05-18 18:30:0013.0513.2713.2713.05163.219034
92016-05-18 18:45:0013.5113.5113.5113.513.691733
102016-05-18 19:00:0013.0313.0413.0413.0389.100000
112016-05-18 19:45:0013.5113.5113.5113.511.000000
122016-05-18 21:15:0013.0813.1313.0813.132.000000
132016-05-18 22:00:0013.1113.1313.1113.133.799265
142016-05-18 22:45:0013.1313.1313.1313.133.798577
152016-05-18 23:15:0013.1313.1313.1313.1345.668768
162016-05-18 23:30:0013.1313.1713.1313.1797.837177
172016-05-18 23:45:0013.1813.1813.1813.1848.523213
182016-05-19 00:45:0013.0013.1813.1813.182.256440
192016-05-19 08:15:0014.1314.2714.2714.13100.000000
202016-05-19 08:30:0014.1014.1314.1314.10101.000000
212016-05-19 16:30:0014.1514.1914.1514.19100.000000
222016-05-19 17:30:0014.1314.1714.1314.171.000000
232016-05-19 17:45:0014.1814.1814.1814.180.794063
242016-05-19 19:15:0014.3314.3414.3314.346.959012
252016-05-19 19:30:0014.0514.3414.3414.3417.379381
262016-05-19 20:45:0014.3414.3514.3414.3520.000000
272016-05-19 22:45:0014.8314.8314.8314.830.100000
282016-05-19 23:45:0014.8914.9014.8914.90600.952309
292016-05-20 00:30:0014.8214.8214.8214.8216.000000
.....................
549042017-12-31 16:30:00737.87743.24738.84740.003013.280414
549052017-12-31 16:45:00735.49741.14740.00738.001573.849483
549062017-12-31 17:00:00737.99742.00737.99739.371333.790085
549072017-12-31 17:15:00739.17741.50739.36740.75845.921922
549082017-12-31 17:30:00738.02743.25740.75743.251660.362365
549092017-12-31 17:45:00742.51743.67743.24743.50824.307330
549102017-12-31 18:00:00743.00744.00743.50744.001080.871577
549112017-12-31 18:15:00741.27744.00743.98742.02809.490039
549122017-12-31 18:30:00738.00742.19742.01739.14990.755928
549132017-12-31 18:45:00739.13739.90739.14739.89741.920552
549142017-12-31 19:00:00739.88742.00739.89742.00738.735585
549152017-12-31 19:15:00741.99743.50742.00743.48974.504834
549162017-12-31 19:30:00740.61743.75743.48741.67800.368667
549172017-12-31 19:45:00741.67743.42741.68743.42684.747274
549182017-12-31 20:00:00743.41744.00743.42744.001142.876682
549192017-12-31 20:15:00743.99744.87744.00744.84666.581856
549202017-12-31 20:30:00744.88748.00744.88747.991243.404868
549212017-12-31 20:45:00747.98750.30747.99750.112968.584571
549222017-12-31 21:00:00745.21751.00750.11745.312018.474614
549232017-12-31 21:15:00743.96746.89745.32744.50795.856323
549242017-12-31 21:30:00744.49747.00744.50745.00581.797757
549252017-12-31 21:45:00744.02746.37745.07746.08546.302125
549262017-12-31 22:00:00743.61747.79746.09744.18802.706264
549272017-12-31 22:15:00743.11746.65744.19743.39545.429944
549282017-12-31 22:30:00743.10745.98743.38744.99793.012603
549292017-12-31 22:45:00743.00750.00744.90743.011741.159341
549302017-12-31 23:00:00742.15743.01743.01742.16554.996150
549312017-12-31 23:15:00740.33742.16742.16742.00888.298569
549322017-12-31 23:30:00741.48743.00742.00743.001191.988408
549332017-12-31 23:45:00741.27743.01742.99741.27954.695232
\n", 623 | "

54934 rows × 6 columns

\n", 624 | "
" 625 | ], 626 | "text/plain": [ 627 | " time low high open close volume\n", 628 | "0 2016-05-18 00:00:00 12.50 12.50 12.50 12.50 0.399002\n", 629 | "1 2016-05-18 00:15:00 12.50 13.00 12.50 13.00 0.790428\n", 630 | "2 2016-05-18 00:30:00 12.75 13.00 12.75 13.00 6.310570\n", 631 | "3 2016-05-18 00:45:00 13.00 14.93 14.93 13.00 0.502848\n", 632 | "4 2016-05-18 01:00:00 14.00 14.00 14.00 14.00 0.462483\n", 633 | "5 2016-05-18 01:15:00 14.00 14.10 14.00 14.10 15.000000\n", 634 | "6 2016-05-18 02:00:00 14.00 14.00 14.00 14.00 0.052000\n", 635 | "7 2016-05-18 17:15:00 13.60 13.60 13.60 13.60 0.366730\n", 636 | "8 2016-05-18 18:30:00 13.05 13.27 13.27 13.05 163.219034\n", 637 | "9 2016-05-18 18:45:00 13.51 13.51 13.51 13.51 3.691733\n", 638 | "10 2016-05-18 19:00:00 13.03 13.04 13.04 13.03 89.100000\n", 639 | "11 2016-05-18 19:45:00 13.51 13.51 13.51 13.51 1.000000\n", 640 | "12 2016-05-18 21:15:00 13.08 13.13 13.08 13.13 2.000000\n", 641 | "13 2016-05-18 22:00:00 13.11 13.13 13.11 13.13 3.799265\n", 642 | "14 2016-05-18 22:45:00 13.13 13.13 13.13 13.13 3.798577\n", 643 | "15 2016-05-18 23:15:00 13.13 13.13 13.13 13.13 45.668768\n", 644 | "16 2016-05-18 23:30:00 13.13 13.17 13.13 13.17 97.837177\n", 645 | "17 2016-05-18 23:45:00 13.18 13.18 13.18 13.18 48.523213\n", 646 | "18 2016-05-19 00:45:00 13.00 13.18 13.18 13.18 2.256440\n", 647 | "19 2016-05-19 08:15:00 14.13 14.27 14.27 14.13 100.000000\n", 648 | "20 2016-05-19 08:30:00 14.10 14.13 14.13 14.10 101.000000\n", 649 | "21 2016-05-19 16:30:00 14.15 14.19 14.15 14.19 100.000000\n", 650 | "22 2016-05-19 17:30:00 14.13 14.17 14.13 14.17 1.000000\n", 651 | "23 2016-05-19 17:45:00 14.18 14.18 14.18 14.18 0.794063\n", 652 | "24 2016-05-19 19:15:00 14.33 14.34 14.33 14.34 6.959012\n", 653 | "25 2016-05-19 19:30:00 14.05 14.34 14.34 14.34 17.379381\n", 654 | "26 2016-05-19 20:45:00 14.34 14.35 14.34 14.35 20.000000\n", 655 | "27 2016-05-19 22:45:00 14.83 14.83 14.83 14.83 0.100000\n", 656 | "28 2016-05-19 23:45:00 14.89 14.90 14.89 14.90 600.952309\n", 657 | "29 2016-05-20 00:30:00 14.82 14.82 14.82 14.82 16.000000\n", 658 | "... ... ... ... ... ... ...\n", 659 | "54904 2017-12-31 16:30:00 737.87 743.24 738.84 740.00 3013.280414\n", 660 | "54905 2017-12-31 16:45:00 735.49 741.14 740.00 738.00 1573.849483\n", 661 | "54906 2017-12-31 17:00:00 737.99 742.00 737.99 739.37 1333.790085\n", 662 | "54907 2017-12-31 17:15:00 739.17 741.50 739.36 740.75 845.921922\n", 663 | "54908 2017-12-31 17:30:00 738.02 743.25 740.75 743.25 1660.362365\n", 664 | "54909 2017-12-31 17:45:00 742.51 743.67 743.24 743.50 824.307330\n", 665 | "54910 2017-12-31 18:00:00 743.00 744.00 743.50 744.00 1080.871577\n", 666 | "54911 2017-12-31 18:15:00 741.27 744.00 743.98 742.02 809.490039\n", 667 | "54912 2017-12-31 18:30:00 738.00 742.19 742.01 739.14 990.755928\n", 668 | "54913 2017-12-31 18:45:00 739.13 739.90 739.14 739.89 741.920552\n", 669 | "54914 2017-12-31 19:00:00 739.88 742.00 739.89 742.00 738.735585\n", 670 | "54915 2017-12-31 19:15:00 741.99 743.50 742.00 743.48 974.504834\n", 671 | "54916 2017-12-31 19:30:00 740.61 743.75 743.48 741.67 800.368667\n", 672 | "54917 2017-12-31 19:45:00 741.67 743.42 741.68 743.42 684.747274\n", 673 | "54918 2017-12-31 20:00:00 743.41 744.00 743.42 744.00 1142.876682\n", 674 | "54919 2017-12-31 20:15:00 743.99 744.87 744.00 744.84 666.581856\n", 675 | "54920 2017-12-31 20:30:00 744.88 748.00 744.88 747.99 1243.404868\n", 676 | "54921 2017-12-31 20:45:00 747.98 750.30 747.99 750.11 2968.584571\n", 677 | "54922 2017-12-31 21:00:00 745.21 751.00 750.11 745.31 2018.474614\n", 678 | "54923 2017-12-31 21:15:00 743.96 746.89 745.32 744.50 795.856323\n", 679 | "54924 2017-12-31 21:30:00 744.49 747.00 744.50 745.00 581.797757\n", 680 | "54925 2017-12-31 21:45:00 744.02 746.37 745.07 746.08 546.302125\n", 681 | "54926 2017-12-31 22:00:00 743.61 747.79 746.09 744.18 802.706264\n", 682 | "54927 2017-12-31 22:15:00 743.11 746.65 744.19 743.39 545.429944\n", 683 | "54928 2017-12-31 22:30:00 743.10 745.98 743.38 744.99 793.012603\n", 684 | "54929 2017-12-31 22:45:00 743.00 750.00 744.90 743.01 1741.159341\n", 685 | "54930 2017-12-31 23:00:00 742.15 743.01 743.01 742.16 554.996150\n", 686 | "54931 2017-12-31 23:15:00 740.33 742.16 742.16 742.00 888.298569\n", 687 | "54932 2017-12-31 23:30:00 741.48 743.00 742.00 743.00 1191.988408\n", 688 | "54933 2017-12-31 23:45:00 741.27 743.01 742.99 741.27 954.695232\n", 689 | "\n", 690 | "[54934 rows x 6 columns]" 691 | ] 692 | }, 693 | "metadata": {}, 694 | "output_type": "display_data" 695 | } 696 | ], 697 | "source": [ 698 | "df_year = client.get_historical_data(begin, end)\n", 699 | "display(df_year)\n", 700 | "# df_year.to_pickle(\"data/ETH_USD_2016_2018_15min.pkl\")" 701 | ] 702 | }, 703 | { 704 | "cell_type": "code", 705 | "execution_count": 34, 706 | "metadata": {}, 707 | "outputs": [ 708 | { 709 | "name": "stdout", 710 | "output_type": "stream", 711 | "text": [ 712 | "54934\n", 713 | "2017-12-31 23:45:00\n", 714 | "[]\n" 715 | ] 716 | } 717 | ], 718 | "source": [ 719 | "print(len(df_year[\"time\"]))\n", 720 | "print(df_year[\"time\"][54934-1])\n", 721 | "a = df_year.loc[1+2:7,[\"close\",\"volume\"]].values\n", 722 | "print(a)" 723 | ] 724 | }, 725 | { 726 | "cell_type": "code", 727 | "execution_count": 4, 728 | "metadata": {}, 729 | "outputs": [ 730 | { 731 | "name": "stdout", 732 | "output_type": "stream", 733 | "text": [ 734 | "No data between 2016-05-18 01:15:00 and 2016-05-18 02:00:00.\n", 735 | "No data between 2016-05-18 02:00:00 and 2016-05-18 17:15:00.\n", 736 | "No data between 2016-05-18 17:15:00 and 2016-05-18 18:30:00.\n", 737 | "No data between 2016-05-18 19:00:00 and 2016-05-18 19:45:00.\n", 738 | "No data between 2016-05-18 19:45:00 and 2016-05-18 21:15:00.\n", 739 | "No data between 2016-05-18 21:15:00 and 2016-05-18 22:00:00.\n", 740 | "No data between 2016-05-18 22:00:00 and 2016-05-18 22:45:00.\n", 741 | "No data between 2016-05-18 22:45:00 and 2016-05-18 23:15:00.\n", 742 | "No data between 2016-05-18 23:45:00 and 2016-05-19 00:45:00.\n", 743 | "No data between 2016-05-19 00:45:00 and 2016-05-19 08:15:00.\n", 744 | "No data between 2016-05-19 08:30:00 and 2016-05-19 16:30:00.\n", 745 | "No data between 2016-05-19 16:30:00 and 2016-05-19 17:30:00.\n", 746 | "No data between 2016-05-19 17:45:00 and 2016-05-19 19:15:00.\n", 747 | "No data between 2016-05-19 19:30:00 and 2016-05-19 20:45:00.\n", 748 | "No data between 2016-05-19 20:45:00 and 2016-05-19 22:45:00.\n", 749 | "No data between 2016-05-19 22:45:00 and 2016-05-19 23:45:00.\n", 750 | "No data between 2016-05-19 23:45:00 and 2016-05-20 00:30:00.\n", 751 | "No data between 2016-05-20 00:30:00 and 2016-05-20 15:00:00.\n", 752 | "No data between 2016-05-20 15:00:00 and 2016-05-20 16:30:00.\n", 753 | "No data between 2016-05-20 16:30:00 and 2016-05-20 20:00:00.\n", 754 | "No data between 2016-05-20 20:00:00 and 2016-05-23 14:00:00.\n", 755 | "No data between 2016-05-23 14:00:00 and 2016-05-23 22:00:00.\n", 756 | "No data between 2016-05-23 22:00:00 and 2016-05-23 23:45:00.\n", 757 | "No data between 2016-05-24 00:00:00 and 2016-05-24 07:45:00.\n", 758 | "No data between 2016-05-24 07:45:00 and 2016-05-24 15:30:00.\n", 759 | "No data between 2016-05-24 15:30:00 and 2016-05-24 16:00:00.\n", 760 | "No data between 2016-05-24 16:00:00 and 2016-05-24 17:15:00.\n", 761 | "No data between 2016-05-24 17:15:00 and 2016-05-24 17:45:00.\n", 762 | "No data between 2016-05-24 17:45:00 and 2016-05-24 18:30:00.\n", 763 | "No data between 2016-05-24 18:30:00 and 2016-05-24 19:00:00.\n", 764 | "No data between 2016-05-24 23:00:00 and 2016-05-24 23:30:00.\n", 765 | "No data between 2016-05-25 00:00:00 and 2016-05-25 00:30:00.\n", 766 | "No data between 2016-05-25 00:30:00 and 2016-05-25 01:00:00.\n", 767 | "No data between 2016-05-25 07:15:00 and 2016-05-25 08:00:00.\n", 768 | "No data between 2016-05-25 08:00:00 and 2016-05-25 08:30:00.\n", 769 | "No data between 2016-05-25 08:45:00 and 2016-05-25 09:15:00.\n", 770 | "No data between 2016-05-25 09:15:00 and 2016-05-25 09:45:00.\n", 771 | "No data between 2016-05-25 10:15:00 and 2016-05-25 10:45:00.\n", 772 | "No data between 2016-05-25 11:15:00 and 2016-05-25 12:00:00.\n", 773 | "No data between 2016-05-25 12:00:00 and 2016-05-25 12:30:00.\n", 774 | "No data between 2016-05-25 15:15:00 and 2016-05-25 15:45:00.\n", 775 | "No data between 2016-05-25 15:45:00 and 2016-05-25 16:15:00.\n", 776 | "No data between 2016-05-25 17:45:00 and 2016-05-25 18:30:00.\n", 777 | "No data between 2016-05-25 18:30:00 and 2016-05-25 19:00:00.\n", 778 | "No data between 2016-05-25 21:15:00 and 2016-05-25 21:45:00.\n", 779 | "No data between 2016-05-25 22:30:00 and 2016-05-25 23:30:00.\n", 780 | "No data between 2016-05-26 00:30:00 and 2016-05-26 01:00:00.\n", 781 | "No data between 2016-05-26 01:00:00 and 2016-05-26 01:30:00.\n", 782 | "No data between 2016-05-26 03:45:00 and 2016-05-26 04:30:00.\n", 783 | "No data between 2016-05-26 04:30:00 and 2016-05-26 05:30:00.\n", 784 | "No data between 2016-05-26 06:00:00 and 2016-05-26 06:30:00.\n", 785 | "No data between 2016-05-26 07:00:00 and 2016-05-26 11:45:00.\n", 786 | "No data between 2016-05-26 12:15:00 and 2016-05-26 13:00:00.\n", 787 | "No data between 2016-05-26 13:00:00 and 2016-05-26 13:30:00.\n", 788 | "No data between 2016-05-26 14:00:00 and 2016-05-26 14:30:00.\n", 789 | "No data between 2016-05-26 14:30:00 and 2016-05-26 15:15:00.\n", 790 | "No data between 2016-05-26 16:15:00 and 2016-05-26 16:45:00.\n", 791 | "No data between 2016-05-26 17:30:00 and 2016-05-26 18:00:00.\n", 792 | "No data between 2016-05-26 20:00:00 and 2016-05-26 20:30:00.\n", 793 | "No data between 2016-05-26 20:30:00 and 2016-05-26 21:00:00.\n", 794 | "No data between 2016-05-26 22:45:00 and 2016-05-26 23:15:00.\n", 795 | "No data between 2016-05-27 02:00:00 and 2016-05-27 02:30:00.\n", 796 | "No data between 2016-05-27 06:30:00 and 2016-05-27 07:00:00.\n", 797 | "No data between 2016-05-27 07:30:00 and 2016-05-27 08:30:00.\n", 798 | "No data between 2016-05-27 08:30:00 and 2016-05-27 09:00:00.\n", 799 | "No data between 2016-05-27 09:00:00 and 2016-05-27 09:30:00.\n", 800 | "No data between 2016-05-27 09:45:00 and 2016-05-27 10:15:00.\n", 801 | "No data between 2016-05-27 12:15:00 and 2016-05-27 12:45:00.\n", 802 | "No data between 2016-05-27 17:00:00 and 2016-05-27 17:30:00.\n", 803 | "No data between 2016-05-27 21:45:00 and 2016-05-27 22:15:00.\n", 804 | "No data between 2016-05-28 01:45:00 and 2016-05-28 02:30:00.\n", 805 | "No data between 2016-05-28 03:00:00 and 2016-05-28 03:30:00.\n", 806 | "No data between 2016-05-28 04:45:00 and 2016-05-28 05:15:00.\n", 807 | "No data between 2016-05-28 06:15:00 and 2016-05-28 06:45:00.\n", 808 | "No data between 2016-05-28 07:45:00 and 2016-05-28 08:15:00.\n", 809 | "No data between 2016-05-28 08:45:00 and 2016-05-28 09:15:00.\n", 810 | "No data between 2016-05-28 09:45:00 and 2016-05-28 10:30:00.\n", 811 | "No data between 2016-05-28 11:15:00 and 2016-05-28 12:00:00.\n", 812 | "No data between 2016-05-28 13:00:00 and 2016-05-28 13:30:00.\n", 813 | "No data between 2016-05-28 13:30:00 and 2016-05-28 14:30:00.\n", 814 | "No data between 2016-05-28 15:00:00 and 2016-05-28 15:30:00.\n", 815 | "No data between 2016-05-28 17:00:00 and 2016-05-28 18:00:00.\n", 816 | "No data between 2016-05-28 18:30:00 and 2016-05-28 19:00:00.\n", 817 | "No data between 2016-05-28 19:30:00 and 2016-05-28 20:15:00.\n", 818 | "No data between 2016-05-28 22:00:00 and 2016-05-28 22:30:00.\n", 819 | "No data between 2016-05-28 22:30:00 and 2016-05-28 23:00:00.\n", 820 | "No data between 2016-05-29 02:15:00 and 2016-05-29 02:45:00.\n", 821 | "No data between 2016-05-29 02:45:00 and 2016-05-29 03:15:00.\n", 822 | "No data between 2016-05-29 03:30:00 and 2016-05-29 04:00:00.\n", 823 | "No data between 2016-05-29 05:30:00 and 2016-05-29 06:30:00.\n", 824 | "No data between 2016-05-29 07:00:00 and 2016-05-29 08:00:00.\n", 825 | "No data between 2016-05-29 08:00:00 and 2016-05-29 08:45:00.\n", 826 | "No data between 2016-05-29 08:45:00 and 2016-05-29 10:45:00.\n", 827 | "No data between 2016-05-29 11:00:00 and 2016-05-29 11:30:00.\n", 828 | "No data between 2016-05-29 11:30:00 and 2016-05-29 12:00:00.\n", 829 | "No data between 2016-05-29 12:15:00 and 2016-05-29 12:45:00.\n", 830 | "No data between 2016-05-29 13:45:00 and 2016-05-29 14:15:00.\n", 831 | "No data between 2016-05-29 14:15:00 and 2016-05-29 14:45:00.\n", 832 | "No data between 2016-05-29 14:45:00 and 2016-05-29 15:30:00.\n", 833 | "No data between 2016-05-29 15:30:00 and 2016-05-29 16:00:00.\n", 834 | "No data between 2016-05-29 16:15:00 and 2016-05-29 16:45:00.\n", 835 | "No data between 2016-05-29 17:15:00 and 2016-05-29 17:45:00.\n", 836 | "No data between 2016-05-29 18:15:00 and 2016-05-29 18:45:00.\n", 837 | "No data between 2016-05-29 20:15:00 and 2016-05-29 20:45:00.\n", 838 | "No data between 2016-05-29 21:00:00 and 2016-05-29 21:45:00.\n", 839 | "No data between 2016-05-29 22:15:00 and 2016-05-29 23:00:00.\n", 840 | "No data between 2016-05-29 23:15:00 and 2016-05-30 00:30:00.\n", 841 | "No data between 2016-05-30 01:15:00 and 2016-05-30 02:00:00.\n", 842 | "No data between 2016-05-30 02:15:00 and 2016-05-30 03:15:00.\n", 843 | "No data between 2016-05-30 03:15:00 and 2016-05-30 03:45:00.\n", 844 | "No data between 2016-05-30 03:45:00 and 2016-05-30 05:15:00.\n", 845 | "No data between 2016-05-30 05:15:00 and 2016-05-30 06:15:00.\n", 846 | "No data between 2016-05-30 06:45:00 and 2016-05-30 07:15:00.\n", 847 | "No data between 2016-05-30 07:15:00 and 2016-05-30 08:15:00.\n", 848 | "No data between 2016-05-30 09:00:00 and 2016-05-30 09:30:00.\n", 849 | "No data between 2016-05-30 11:00:00 and 2016-05-30 11:45:00.\n", 850 | "No data between 2016-05-30 12:00:00 and 2016-05-30 12:30:00.\n", 851 | "No data between 2016-05-30 13:15:00 and 2016-05-30 13:45:00.\n", 852 | "No data between 2016-05-30 14:00:00 and 2016-05-30 14:45:00.\n", 853 | "No data between 2016-05-30 17:30:00 and 2016-05-30 18:00:00.\n", 854 | "No data between 2016-05-30 18:15:00 and 2016-05-30 18:45:00.\n", 855 | "No data between 2016-05-30 19:45:00 and 2016-05-30 20:15:00.\n", 856 | "No data between 2016-05-30 20:45:00 and 2016-05-30 21:15:00.\n", 857 | "No data between 2016-05-30 21:15:00 and 2016-05-30 22:00:00.\n", 858 | "No data between 2016-05-30 22:15:00 and 2016-05-30 22:45:00.\n", 859 | "No data between 2016-05-30 23:30:00 and 2016-05-31 00:15:00.\n", 860 | "No data between 2016-05-31 01:30:00 and 2016-05-31 02:00:00.\n", 861 | "No data between 2016-05-31 02:45:00 and 2016-05-31 03:15:00.\n", 862 | "No data between 2016-05-31 03:30:00 and 2016-05-31 04:00:00.\n", 863 | "No data between 2016-05-31 04:00:00 and 2016-05-31 04:45:00.\n", 864 | "No data between 2016-05-31 04:45:00 and 2016-05-31 05:45:00.\n", 865 | "No data between 2016-05-31 05:45:00 and 2016-05-31 07:00:00.\n", 866 | "No data between 2016-05-31 07:30:00 and 2016-05-31 08:15:00.\n", 867 | "No data between 2016-05-31 08:45:00 and 2016-05-31 09:15:00.\n", 868 | "No data between 2016-05-31 09:30:00 and 2016-05-31 11:00:00.\n", 869 | "No data between 2016-05-31 11:00:00 and 2016-05-31 11:45:00.\n", 870 | "No data between 2016-05-31 11:45:00 and 2016-05-31 12:15:00.\n", 871 | "No data between 2016-05-31 13:45:00 and 2016-05-31 14:15:00.\n", 872 | "No data between 2016-05-31 16:45:00 and 2016-05-31 17:15:00.\n", 873 | "No data between 2016-05-31 22:45:00 and 2016-05-31 23:30:00.\n", 874 | "No data between 2016-06-01 00:30:00 and 2016-06-01 01:00:00.\n", 875 | "No data between 2016-06-01 01:45:00 and 2016-06-01 02:15:00.\n", 876 | "No data between 2016-06-01 04:45:00 and 2016-06-01 05:15:00.\n", 877 | "No data between 2016-06-01 07:15:00 and 2016-06-01 07:45:00.\n", 878 | "No data between 2016-06-01 09:00:00 and 2016-06-01 10:00:00.\n", 879 | "No data between 2016-06-01 10:00:00 and 2016-06-01 10:45:00.\n", 880 | "No data between 2016-06-01 11:15:00 and 2016-06-01 11:45:00.\n", 881 | "No data between 2016-06-01 17:00:00 and 2016-06-01 17:30:00.\n", 882 | "No data between 2016-06-01 23:30:00 and 2016-06-02 00:00:00.\n", 883 | "No data between 2016-06-02 01:00:00 and 2016-06-02 01:30:00.\n", 884 | "No data between 2016-06-02 02:00:00 and 2016-06-02 02:30:00.\n", 885 | "No data between 2016-06-02 02:45:00 and 2016-06-02 03:15:00.\n", 886 | "No data between 2016-06-02 05:15:00 and 2016-06-02 05:45:00.\n", 887 | "No data between 2016-06-02 07:00:00 and 2016-06-02 07:45:00.\n", 888 | "No data between 2016-06-02 07:45:00 and 2016-06-02 08:30:00.\n", 889 | "No data between 2016-06-02 09:00:00 and 2016-06-02 11:00:00.\n", 890 | "No data between 2016-06-02 11:00:00 and 2016-06-02 11:30:00.\n", 891 | "No data between 2016-06-02 11:30:00 and 2016-06-02 12:30:00.\n", 892 | "No data between 2016-06-02 13:15:00 and 2016-06-02 14:00:00.\n", 893 | "No data between 2016-06-02 17:00:00 and 2016-06-02 17:30:00.\n", 894 | "No data between 2016-06-02 20:30:00 and 2016-06-02 21:00:00.\n", 895 | "No data between 2016-06-02 23:00:00 and 2016-06-02 23:30:00.\n", 896 | "No data between 2016-06-03 01:00:00 and 2016-06-03 01:30:00.\n", 897 | "No data between 2016-06-03 02:15:00 and 2016-06-03 03:00:00.\n", 898 | "No data between 2016-06-03 04:15:00 and 2016-06-03 05:00:00.\n", 899 | "No data between 2016-06-03 05:00:00 and 2016-06-03 05:30:00.\n", 900 | "No data between 2016-06-03 05:45:00 and 2016-06-03 06:15:00.\n", 901 | "No data between 2016-06-03 07:30:00 and 2016-06-03 08:15:00.\n", 902 | "No data between 2016-06-03 09:30:00 and 2016-06-03 10:00:00.\n", 903 | "No data between 2016-06-03 12:15:00 and 2016-06-03 12:45:00.\n", 904 | "No data between 2016-06-03 21:30:00 and 2016-06-03 22:00:00.\n", 905 | "No data between 2016-06-03 22:00:00 and 2016-06-03 22:30:00.\n", 906 | "No data between 2016-06-04 00:45:00 and 2016-06-04 01:15:00.\n", 907 | "No data between 2016-06-04 01:15:00 and 2016-06-04 01:45:00.\n", 908 | "No data between 2016-06-04 02:45:00 and 2016-06-04 03:15:00.\n", 909 | "No data between 2016-06-04 03:15:00 and 2016-06-04 03:45:00.\n", 910 | "No data between 2016-06-04 04:45:00 and 2016-06-04 05:15:00.\n", 911 | "No data between 2016-06-04 05:45:00 and 2016-06-04 06:15:00.\n", 912 | "No data between 2016-06-04 07:15:00 and 2016-06-04 07:45:00.\n", 913 | "No data between 2016-06-04 08:15:00 and 2016-06-04 09:00:00.\n", 914 | "No data between 2016-06-04 10:30:00 and 2016-06-04 12:00:00.\n", 915 | "No data between 2016-06-04 12:00:00 and 2016-06-04 12:45:00.\n", 916 | "No data between 2016-06-04 12:45:00 and 2016-06-04 13:45:00.\n", 917 | "No data between 2016-06-04 13:45:00 and 2016-06-04 14:15:00.\n", 918 | "No data between 2016-06-04 15:45:00 and 2016-06-04 16:15:00.\n", 919 | "No data between 2016-06-04 18:00:00 and 2016-06-04 18:30:00.\n", 920 | "No data between 2016-06-04 20:30:00 and 2016-06-04 21:45:00.\n" 921 | ] 922 | }, 923 | { 924 | "name": "stdout", 925 | "output_type": "stream", 926 | "text": [ 927 | "No data between 2016-06-04 21:45:00 and 2016-06-04 22:15:00.\n", 928 | "No data between 2016-06-04 22:30:00 and 2016-06-04 23:30:00.\n", 929 | "No data between 2016-06-05 00:00:00 and 2016-06-05 00:45:00.\n", 930 | "No data between 2016-06-05 00:45:00 and 2016-06-05 01:30:00.\n", 931 | "No data between 2016-06-05 03:00:00 and 2016-06-05 03:30:00.\n", 932 | "No data between 2016-06-05 05:00:00 and 2016-06-05 05:30:00.\n", 933 | "No data between 2016-06-05 05:30:00 and 2016-06-05 06:15:00.\n", 934 | "No data between 2016-06-05 06:45:00 and 2016-06-05 07:45:00.\n", 935 | "No data between 2016-06-05 07:45:00 and 2016-06-05 09:15:00.\n", 936 | "No data between 2016-06-05 09:15:00 and 2016-06-05 10:45:00.\n", 937 | "No data between 2016-06-05 10:45:00 and 2016-06-05 11:15:00.\n", 938 | "No data between 2016-06-05 11:15:00 and 2016-06-05 12:45:00.\n", 939 | "No data between 2016-06-05 12:45:00 and 2016-06-05 13:30:00.\n", 940 | "No data between 2016-06-05 13:30:00 and 2016-06-05 14:00:00.\n", 941 | "No data between 2016-06-05 14:15:00 and 2016-06-05 15:15:00.\n", 942 | "No data between 2016-06-05 16:15:00 and 2016-06-05 17:00:00.\n", 943 | "No data between 2016-06-05 17:15:00 and 2016-06-05 17:45:00.\n", 944 | "No data between 2016-06-05 18:15:00 and 2016-06-05 18:45:00.\n", 945 | "No data between 2016-06-05 18:45:00 and 2016-06-05 19:15:00.\n", 946 | "No data between 2016-06-05 19:30:00 and 2016-06-05 20:00:00.\n", 947 | "No data between 2016-06-05 20:00:00 and 2016-06-05 20:45:00.\n", 948 | "No data between 2016-06-05 20:45:00 and 2016-06-05 21:30:00.\n", 949 | "No data between 2016-06-05 21:45:00 and 2016-06-05 22:15:00.\n", 950 | "No data between 2016-06-05 22:15:00 and 2016-06-05 23:00:00.\n", 951 | "No data between 2016-06-05 23:15:00 and 2016-06-06 00:45:00.\n", 952 | "No data between 2016-06-06 01:00:00 and 2016-06-06 02:15:00.\n", 953 | "No data between 2016-06-06 03:15:00 and 2016-06-06 03:45:00.\n", 954 | "No data between 2016-06-06 04:00:00 and 2016-06-06 04:45:00.\n", 955 | "No data between 2016-06-06 05:00:00 and 2016-06-06 06:00:00.\n", 956 | "No data between 2016-06-06 06:30:00 and 2016-06-06 07:00:00.\n", 957 | "No data between 2016-06-06 07:00:00 and 2016-06-06 07:45:00.\n", 958 | "No data between 2016-06-06 08:00:00 and 2016-06-06 10:15:00.\n", 959 | "No data between 2016-06-06 10:15:00 and 2016-06-06 11:15:00.\n", 960 | "No data between 2016-06-06 12:00:00 and 2016-06-06 13:00:00.\n", 961 | "No data between 2016-06-06 13:00:00 and 2016-06-06 13:30:00.\n", 962 | "No data between 2016-06-06 17:15:00 and 2016-06-06 17:45:00.\n", 963 | "No data between 2016-06-06 21:45:00 and 2016-06-06 22:15:00.\n", 964 | "No data between 2016-06-06 23:15:00 and 2016-06-07 00:00:00.\n", 965 | "No data between 2016-06-07 05:00:00 and 2016-06-07 05:30:00.\n", 966 | "No data between 2016-06-07 05:30:00 and 2016-06-07 06:00:00.\n", 967 | "No data between 2016-06-07 06:30:00 and 2016-06-07 07:15:00.\n", 968 | "No data between 2016-06-07 07:15:00 and 2016-06-07 07:45:00.\n", 969 | "No data between 2016-06-07 07:45:00 and 2016-06-07 08:15:00.\n", 970 | "No data between 2016-06-07 08:15:00 and 2016-06-07 08:45:00.\n", 971 | "No data between 2016-06-07 09:00:00 and 2016-06-07 09:30:00.\n", 972 | "No data between 2016-06-07 14:45:00 and 2016-06-07 15:15:00.\n", 973 | "No data between 2016-06-07 19:30:00 and 2016-06-07 20:00:00.\n", 974 | "No data between 2016-06-07 20:45:00 and 2016-06-07 21:30:00.\n", 975 | "No data between 2016-06-07 21:30:00 and 2016-06-07 22:15:00.\n", 976 | "No data between 2016-06-08 05:30:00 and 2016-06-08 06:00:00.\n", 977 | "No data between 2016-06-08 06:00:00 and 2016-06-08 07:30:00.\n", 978 | "No data between 2016-06-08 07:30:00 and 2016-06-08 08:00:00.\n", 979 | "No data between 2016-06-08 09:00:00 and 2016-06-08 10:15:00.\n", 980 | "No data between 2016-06-08 10:15:00 and 2016-06-08 10:45:00.\n", 981 | "No data between 2016-06-08 11:15:00 and 2016-06-08 12:00:00.\n", 982 | "No data between 2016-06-08 12:15:00 and 2016-06-08 12:45:00.\n", 983 | "No data between 2016-06-08 13:00:00 and 2016-06-08 13:30:00.\n", 984 | "No data between 2016-06-08 17:00:00 and 2016-06-08 17:30:00.\n", 985 | "No data between 2016-06-08 19:45:00 and 2016-06-08 20:15:00.\n", 986 | "No data between 2016-06-08 21:15:00 and 2016-06-08 21:45:00.\n", 987 | "No data between 2016-06-08 23:00:00 and 2016-06-08 23:30:00.\n", 988 | "No data between 2016-06-09 01:45:00 and 2016-06-09 02:15:00.\n", 989 | "No data between 2016-06-09 02:15:00 and 2016-06-09 02:45:00.\n", 990 | "No data between 2016-06-09 06:30:00 and 2016-06-09 07:00:00.\n", 991 | "No data between 2016-06-09 07:00:00 and 2016-06-09 07:30:00.\n", 992 | "No data between 2016-06-09 07:30:00 and 2016-06-09 08:15:00.\n", 993 | "No data between 2016-06-09 08:15:00 and 2016-06-09 08:45:00.\n", 994 | "No data between 2016-06-09 08:45:00 and 2016-06-09 09:45:00.\n", 995 | "No data between 2016-06-09 11:00:00 and 2016-06-09 11:30:00.\n", 996 | "No data between 2016-06-09 11:30:00 and 2016-06-09 12:15:00.\n", 997 | "No data between 2016-06-09 12:15:00 and 2016-06-09 12:45:00.\n", 998 | "No data between 2016-06-09 14:15:00 and 2016-06-09 14:45:00.\n", 999 | "No data between 2016-06-09 15:00:00 and 2016-06-09 15:30:00.\n", 1000 | "No data between 2016-06-09 15:30:00 and 2016-06-09 16:00:00.\n", 1001 | "No data between 2016-06-09 21:15:00 and 2016-06-09 21:45:00.\n", 1002 | "No data between 2016-06-09 22:00:00 and 2016-06-09 22:30:00.\n", 1003 | "No data between 2016-06-09 22:45:00 and 2016-06-09 23:15:00.\n", 1004 | "No data between 2016-06-09 23:15:00 and 2016-06-10 00:00:00.\n", 1005 | "No data between 2016-06-10 00:30:00 and 2016-06-10 01:15:00.\n", 1006 | "No data between 2016-06-10 05:15:00 and 2016-06-10 06:00:00.\n", 1007 | "No data between 2016-06-10 09:00:00 and 2016-06-10 09:30:00.\n", 1008 | "No data between 2016-06-10 10:45:00 and 2016-06-10 11:45:00.\n", 1009 | "No data between 2016-06-10 11:45:00 and 2016-06-10 12:15:00.\n", 1010 | "No data between 2016-06-10 23:00:00 and 2016-06-10 23:30:00.\n", 1011 | "No data between 2016-06-11 03:00:00 and 2016-06-11 03:30:00.\n", 1012 | "No data between 2016-06-11 05:00:00 and 2016-06-11 05:30:00.\n", 1013 | "No data between 2016-06-11 05:30:00 and 2016-06-11 06:00:00.\n", 1014 | "No data between 2016-06-11 06:00:00 and 2016-06-11 07:00:00.\n", 1015 | "No data between 2016-06-11 07:00:00 and 2016-06-11 08:00:00.\n", 1016 | "No data between 2016-06-11 08:45:00 and 2016-06-11 09:15:00.\n", 1017 | "No data between 2016-06-11 10:45:00 and 2016-06-11 11:15:00.\n", 1018 | "No data between 2016-06-11 11:15:00 and 2016-06-11 12:30:00.\n", 1019 | "No data between 2016-06-11 13:30:00 and 2016-06-11 14:00:00.\n", 1020 | "No data between 2016-06-11 14:00:00 and 2016-06-11 14:30:00.\n", 1021 | "No data between 2016-06-11 14:30:00 and 2016-06-11 15:00:00.\n", 1022 | "No data between 2016-06-11 15:15:00 and 2016-06-11 15:45:00.\n", 1023 | "No data between 2016-06-11 15:45:00 and 2016-06-11 16:15:00.\n", 1024 | "No data between 2016-06-11 16:45:00 and 2016-06-11 17:15:00.\n", 1025 | "No data between 2016-06-11 17:15:00 and 2016-06-11 17:45:00.\n", 1026 | "No data between 2016-06-11 19:30:00 and 2016-06-11 20:00:00.\n", 1027 | "No data between 2016-06-11 20:30:00 and 2016-06-11 21:00:00.\n", 1028 | "No data between 2016-06-11 22:00:00 and 2016-06-11 22:30:00.\n", 1029 | "No data between 2016-06-12 02:30:00 and 2016-06-12 03:00:00.\n", 1030 | "No data between 2016-06-12 03:15:00 and 2016-06-12 03:45:00.\n", 1031 | "No data between 2016-06-12 07:15:00 and 2016-06-12 07:45:00.\n", 1032 | "No data between 2016-06-12 08:00:00 and 2016-06-12 09:00:00.\n", 1033 | "No data between 2016-06-12 09:00:00 and 2016-06-12 09:30:00.\n", 1034 | "No data between 2016-06-12 09:45:00 and 2016-06-12 10:15:00.\n", 1035 | "No data between 2016-06-12 10:30:00 and 2016-06-12 11:00:00.\n", 1036 | "No data between 2016-06-12 11:15:00 and 2016-06-12 12:00:00.\n", 1037 | "No data between 2016-06-12 21:00:00 and 2016-06-12 21:30:00.\n", 1038 | "No data between 2016-06-13 04:30:00 and 2016-06-13 05:00:00.\n", 1039 | "No data between 2016-06-13 09:30:00 and 2016-06-13 10:15:00.\n", 1040 | "No data between 2016-06-13 10:45:00 and 2016-06-13 11:15:00.\n", 1041 | "No data between 2016-06-14 07:45:00 and 2016-06-14 09:00:00.\n", 1042 | "No data between 2016-06-14 09:00:00 and 2016-06-14 10:15:00.\n", 1043 | "No data between 2016-06-14 10:30:00 and 2016-06-14 11:00:00.\n", 1044 | "No data between 2016-06-14 12:45:00 and 2016-06-14 13:15:00.\n", 1045 | "No data between 2016-06-15 05:15:00 and 2016-06-15 05:45:00.\n", 1046 | "No data between 2016-06-15 06:15:00 and 2016-06-15 06:45:00.\n", 1047 | "No data between 2016-06-15 07:00:00 and 2016-06-15 07:45:00.\n", 1048 | "No data between 2016-06-15 08:15:00 and 2016-06-15 08:45:00.\n", 1049 | "No data between 2016-06-15 09:30:00 and 2016-06-15 10:00:00.\n", 1050 | "No data between 2016-06-15 10:15:00 and 2016-06-15 10:45:00.\n", 1051 | "No data between 2016-06-15 10:45:00 and 2016-06-15 11:15:00.\n", 1052 | "No data between 2016-06-15 14:15:00 and 2016-06-15 14:45:00.\n", 1053 | "No data between 2016-06-16 06:45:00 and 2016-06-16 07:30:00.\n", 1054 | "No data between 2016-06-16 07:30:00 and 2016-06-16 09:00:00.\n", 1055 | "No data between 2016-06-16 10:45:00 and 2016-06-16 11:30:00.\n", 1056 | "No data between 2016-06-17 01:45:00 and 2016-06-17 02:15:00.\n", 1057 | "No data between 2016-06-18 03:30:00 and 2016-06-18 04:00:00.\n", 1058 | "No data between 2016-06-18 11:00:00 and 2016-06-18 11:30:00.\n", 1059 | "No data between 2016-06-19 08:00:00 and 2016-06-19 09:00:00.\n", 1060 | "No data between 2016-06-19 09:00:00 and 2016-06-19 09:30:00.\n", 1061 | "No data between 2016-06-19 09:30:00 and 2016-06-19 10:30:00.\n", 1062 | "No data between 2016-06-19 11:15:00 and 2016-06-19 12:00:00.\n", 1063 | "No data between 2016-06-19 12:45:00 and 2016-06-19 13:30:00.\n", 1064 | "No data between 2016-06-19 14:15:00 and 2016-06-19 14:45:00.\n", 1065 | "No data between 2016-06-19 20:45:00 and 2016-06-19 21:15:00.\n", 1066 | "No data between 2016-06-20 00:45:00 and 2016-06-20 01:15:00.\n", 1067 | "No data between 2016-06-20 02:15:00 and 2016-06-20 02:45:00.\n", 1068 | "No data between 2016-06-20 03:15:00 and 2016-06-20 03:45:00.\n", 1069 | "No data between 2016-06-20 07:45:00 and 2016-06-20 08:15:00.\n", 1070 | "No data between 2016-06-20 09:30:00 and 2016-06-20 10:00:00.\n", 1071 | "No data between 2016-06-20 19:45:00 and 2016-06-20 20:15:00.\n", 1072 | "No data between 2016-06-20 21:30:00 and 2016-06-20 22:00:00.\n", 1073 | "No data between 2016-06-21 05:45:00 and 2016-06-21 06:15:00.\n", 1074 | "No data between 2016-06-21 06:30:00 and 2016-06-21 07:00:00.\n", 1075 | "No data between 2016-06-21 08:15:00 and 2016-06-21 08:45:00.\n", 1076 | "No data between 2016-06-21 09:00:00 and 2016-06-21 09:45:00.\n", 1077 | "No data between 2016-06-21 09:45:00 and 2016-06-21 10:30:00.\n", 1078 | "No data between 2016-06-21 11:15:00 and 2016-06-21 11:45:00.\n", 1079 | "No data between 2016-06-22 07:30:00 and 2016-06-22 08:00:00.\n", 1080 | "No data between 2016-06-22 08:15:00 and 2016-06-22 08:45:00.\n", 1081 | "No data between 2016-06-22 09:00:00 and 2016-06-22 09:30:00.\n", 1082 | "No data between 2016-06-22 10:15:00 and 2016-06-22 10:45:00.\n", 1083 | "No data between 2016-06-22 18:00:00 and 2016-06-22 18:30:00.\n", 1084 | "No data between 2016-06-23 07:15:00 and 2016-06-23 07:45:00.\n", 1085 | "No data between 2016-06-23 07:45:00 and 2016-06-23 08:15:00.\n", 1086 | "No data between 2016-06-23 09:45:00 and 2016-06-23 10:15:00.\n", 1087 | "No data between 2016-06-23 10:15:00 and 2016-06-23 10:45:00.\n", 1088 | "No data between 2016-06-23 10:45:00 and 2016-06-23 11:15:00.\n", 1089 | "No data between 2016-06-23 12:15:00 and 2016-06-23 12:45:00.\n", 1090 | "No data between 2016-06-23 14:00:00 and 2016-06-23 14:30:00.\n", 1091 | "No data between 2016-06-24 09:30:00 and 2016-06-24 10:00:00.\n", 1092 | "No data between 2016-06-25 02:00:00 and 2016-06-25 02:30:00.\n", 1093 | "No data between 2016-06-25 05:30:00 and 2016-06-25 06:00:00.\n", 1094 | "No data between 2016-06-25 07:45:00 and 2016-06-25 08:15:00.\n", 1095 | "No data between 2016-06-25 09:45:00 and 2016-06-25 10:30:00.\n", 1096 | "No data between 2016-06-25 12:00:00 and 2016-06-25 12:45:00.\n", 1097 | "No data between 2016-06-25 12:45:00 and 2016-06-25 13:15:00.\n", 1098 | "No data between 2016-06-25 17:45:00 and 2016-06-25 18:15:00.\n", 1099 | "No data between 2016-06-25 20:30:00 and 2016-06-25 21:00:00.\n", 1100 | "No data between 2016-06-25 21:00:00 and 2016-06-25 21:30:00.\n", 1101 | "No data between 2016-06-25 23:30:00 and 2016-06-26 00:30:00.\n", 1102 | "No data between 2016-06-26 00:30:00 and 2016-06-26 01:00:00.\n", 1103 | "No data between 2016-06-26 02:45:00 and 2016-06-26 03:15:00.\n", 1104 | "No data between 2016-06-26 05:30:00 and 2016-06-26 06:15:00.\n", 1105 | "No data between 2016-06-26 06:30:00 and 2016-06-26 07:00:00.\n", 1106 | "No data between 2016-06-26 07:00:00 and 2016-06-26 09:15:00.\n", 1107 | "No data between 2016-06-26 09:15:00 and 2016-06-26 09:45:00.\n", 1108 | "No data between 2016-06-26 09:45:00 and 2016-06-26 10:15:00.\n", 1109 | "No data between 2016-06-26 10:15:00 and 2016-06-26 10:45:00.\n", 1110 | "No data between 2016-06-26 11:00:00 and 2016-06-26 11:30:00.\n", 1111 | "No data between 2016-06-26 11:30:00 and 2016-06-26 12:15:00.\n", 1112 | "No data between 2016-06-26 12:45:00 and 2016-06-26 13:15:00.\n", 1113 | "No data between 2016-06-26 16:00:00 and 2016-06-26 16:30:00.\n", 1114 | "No data between 2016-06-26 17:45:00 and 2016-06-26 18:15:00.\n", 1115 | "No data between 2016-06-26 20:45:00 and 2016-06-26 21:15:00.\n", 1116 | "No data between 2016-06-26 21:15:00 and 2016-06-26 21:45:00.\n", 1117 | "No data between 2016-06-26 22:00:00 and 2016-06-26 22:30:00.\n", 1118 | "No data between 2016-06-26 22:30:00 and 2016-06-26 23:45:00.\n", 1119 | "No data between 2016-06-26 23:45:00 and 2016-06-27 00:30:00.\n", 1120 | "No data between 2016-06-27 01:15:00 and 2016-06-27 01:45:00.\n", 1121 | "No data between 2016-06-27 02:45:00 and 2016-06-27 03:15:00.\n" 1122 | ] 1123 | }, 1124 | { 1125 | "name": "stdout", 1126 | "output_type": "stream", 1127 | "text": [ 1128 | "No data between 2016-06-27 03:15:00 and 2016-06-27 04:15:00.\n", 1129 | "No data between 2016-06-27 04:15:00 and 2016-06-27 04:45:00.\n", 1130 | "No data between 2016-06-27 05:00:00 and 2016-06-27 06:15:00.\n", 1131 | "No data between 2016-06-27 07:00:00 and 2016-06-27 07:30:00.\n", 1132 | "No data between 2016-06-27 07:30:00 and 2016-06-27 08:15:00.\n", 1133 | "No data between 2016-06-27 09:00:00 and 2016-06-27 10:00:00.\n", 1134 | "No data between 2016-06-27 11:00:00 and 2016-06-27 11:30:00.\n", 1135 | "No data between 2016-06-27 11:30:00 and 2016-06-27 12:00:00.\n", 1136 | "No data between 2016-06-27 12:45:00 and 2016-06-27 13:30:00.\n", 1137 | "No data between 2016-06-27 21:00:00 and 2016-06-27 21:30:00.\n", 1138 | "No data between 2016-06-27 23:15:00 and 2016-06-27 23:45:00.\n", 1139 | "No data between 2016-06-28 01:15:00 and 2016-06-28 02:00:00.\n", 1140 | "No data between 2016-06-28 02:00:00 and 2016-06-28 02:30:00.\n", 1141 | "No data between 2016-06-28 04:00:00 and 2016-06-28 04:30:00.\n", 1142 | "No data between 2016-06-28 05:00:00 and 2016-06-28 05:30:00.\n", 1143 | "No data between 2016-06-28 07:30:00 and 2016-06-28 08:45:00.\n", 1144 | "No data between 2016-06-28 08:45:00 and 2016-06-28 09:45:00.\n", 1145 | "No data between 2016-06-28 09:45:00 and 2016-06-28 10:15:00.\n", 1146 | "No data between 2016-06-28 11:30:00 and 2016-06-28 12:15:00.\n", 1147 | "No data between 2016-06-29 02:45:00 and 2016-06-29 03:15:00.\n", 1148 | "No data between 2016-06-29 06:15:00 and 2016-06-29 06:45:00.\n", 1149 | "No data between 2016-06-29 06:45:00 and 2016-06-29 08:15:00.\n", 1150 | "No data between 2016-06-29 10:30:00 and 2016-06-29 11:00:00.\n", 1151 | "No data between 2016-06-29 11:00:00 and 2016-06-29 11:45:00.\n", 1152 | "No data between 2016-06-29 18:45:00 and 2016-06-29 19:15:00.\n", 1153 | "No data between 2016-06-29 21:00:00 and 2016-06-29 21:30:00.\n", 1154 | "No data between 2016-06-30 00:15:00 and 2016-06-30 00:45:00.\n", 1155 | "No data between 2016-06-30 01:15:00 and 2016-06-30 02:00:00.\n", 1156 | "No data between 2016-06-30 02:30:00 and 2016-06-30 03:00:00.\n", 1157 | "No data between 2016-06-30 03:30:00 and 2016-06-30 04:00:00.\n", 1158 | "No data between 2016-06-30 04:30:00 and 2016-06-30 05:00:00.\n", 1159 | "No data between 2016-06-30 05:30:00 and 2016-06-30 07:15:00.\n", 1160 | "No data between 2016-06-30 08:15:00 and 2016-06-30 09:00:00.\n", 1161 | "No data between 2016-06-30 09:00:00 and 2016-06-30 09:30:00.\n", 1162 | "No data between 2016-06-30 10:45:00 and 2016-06-30 11:30:00.\n", 1163 | "No data between 2016-06-30 12:15:00 and 2016-06-30 12:45:00.\n", 1164 | "No data between 2016-06-30 15:15:00 and 2016-06-30 15:45:00.\n", 1165 | "No data between 2016-06-30 16:30:00 and 2016-06-30 17:00:00.\n", 1166 | "No data between 2016-06-30 21:00:00 and 2016-06-30 21:30:00.\n", 1167 | "No data between 2016-06-30 22:30:00 and 2016-06-30 23:00:00.\n", 1168 | "No data between 2016-07-01 01:15:00 and 2016-07-01 01:45:00.\n", 1169 | "No data between 2016-07-01 01:45:00 and 2016-07-01 02:15:00.\n", 1170 | "No data between 2016-07-01 02:15:00 and 2016-07-01 02:45:00.\n", 1171 | "No data between 2016-07-01 03:45:00 and 2016-07-01 04:30:00.\n", 1172 | "No data between 2016-07-01 04:45:00 and 2016-07-01 05:45:00.\n", 1173 | "No data between 2016-07-01 05:45:00 and 2016-07-01 06:15:00.\n", 1174 | "No data between 2016-07-01 08:00:00 and 2016-07-01 08:30:00.\n", 1175 | "No data between 2016-07-01 08:45:00 and 2016-07-01 09:30:00.\n", 1176 | "No data between 2016-07-01 09:30:00 and 2016-07-01 10:00:00.\n", 1177 | "No data between 2016-07-01 11:00:00 and 2016-07-01 11:30:00.\n", 1178 | "No data between 2016-07-01 18:45:00 and 2016-07-01 19:15:00.\n", 1179 | "No data between 2016-07-01 20:45:00 and 2016-07-01 21:15:00.\n", 1180 | "No data between 2016-07-01 21:30:00 and 2016-07-01 22:00:00.\n", 1181 | "No data between 2016-07-01 22:45:00 and 2016-07-01 23:30:00.\n", 1182 | "No data between 2016-07-02 03:00:00 and 2016-07-02 03:30:00.\n", 1183 | "No data between 2016-07-02 03:30:00 and 2016-07-02 04:15:00.\n", 1184 | "No data between 2016-07-02 05:30:00 and 2016-07-02 06:15:00.\n", 1185 | "No data between 2016-07-02 06:15:00 and 2016-07-02 06:45:00.\n", 1186 | "No data between 2016-07-02 06:45:00 and 2016-07-02 07:45:00.\n", 1187 | "No data between 2016-07-02 07:45:00 and 2016-07-02 10:30:00.\n", 1188 | "No data between 2016-07-02 10:30:00 and 2016-07-02 11:15:00.\n", 1189 | "No data between 2016-07-02 11:30:00 and 2016-07-02 12:00:00.\n", 1190 | "No data between 2016-07-02 12:00:00 and 2016-07-02 12:30:00.\n", 1191 | "No data between 2016-07-02 13:30:00 and 2016-07-02 14:15:00.\n", 1192 | "No data between 2016-07-02 14:30:00 and 2016-07-02 15:00:00.\n", 1193 | "No data between 2016-07-02 15:45:00 and 2016-07-02 16:15:00.\n", 1194 | "No data between 2016-07-02 19:00:00 and 2016-07-02 20:30:00.\n", 1195 | "No data between 2016-07-02 20:30:00 and 2016-07-02 21:00:00.\n", 1196 | "No data between 2016-07-02 21:15:00 and 2016-07-02 21:45:00.\n", 1197 | "No data between 2016-07-02 22:00:00 and 2016-07-02 22:30:00.\n", 1198 | "No data between 2016-07-02 22:30:00 and 2016-07-02 23:00:00.\n", 1199 | "No data between 2016-07-02 23:00:00 and 2016-07-02 23:30:00.\n", 1200 | "No data between 2016-07-03 00:15:00 and 2016-07-03 01:00:00.\n", 1201 | "No data between 2016-07-03 03:00:00 and 2016-07-03 03:30:00.\n", 1202 | "No data between 2016-07-03 03:30:00 and 2016-07-03 04:00:00.\n", 1203 | "No data between 2016-07-03 04:15:00 and 2016-07-03 04:45:00.\n", 1204 | "No data between 2016-07-03 04:45:00 and 2016-07-03 06:00:00.\n", 1205 | "No data between 2016-07-03 06:00:00 and 2016-07-03 06:30:00.\n", 1206 | "No data between 2016-07-03 06:30:00 and 2016-07-03 07:15:00.\n", 1207 | "No data between 2016-07-03 07:15:00 and 2016-07-03 08:15:00.\n", 1208 | "No data between 2016-07-03 08:15:00 and 2016-07-03 08:45:00.\n", 1209 | "No data between 2016-07-03 09:00:00 and 2016-07-03 09:30:00.\n", 1210 | "No data between 2016-07-03 10:30:00 and 2016-07-03 11:15:00.\n", 1211 | "No data between 2016-07-03 11:15:00 and 2016-07-03 12:30:00.\n", 1212 | "No data between 2016-07-03 13:15:00 and 2016-07-03 14:00:00.\n", 1213 | "No data between 2016-07-03 17:45:00 and 2016-07-03 18:15:00.\n", 1214 | "No data between 2016-07-03 19:30:00 and 2016-07-03 20:15:00.\n", 1215 | "No data between 2016-07-03 20:45:00 and 2016-07-03 21:15:00.\n", 1216 | "No data between 2016-07-03 21:15:00 and 2016-07-03 21:45:00.\n", 1217 | "No data between 2016-07-03 21:45:00 and 2016-07-03 22:30:00.\n", 1218 | "No data between 2016-07-03 22:30:00 and 2016-07-03 23:15:00.\n", 1219 | "No data between 2016-07-04 00:00:00 and 2016-07-04 01:15:00.\n", 1220 | "No data between 2016-07-04 01:30:00 and 2016-07-04 02:00:00.\n", 1221 | "No data between 2016-07-04 02:00:00 and 2016-07-04 02:30:00.\n", 1222 | "No data between 2016-07-04 02:30:00 and 2016-07-04 03:15:00.\n", 1223 | "No data between 2016-07-04 04:15:00 and 2016-07-04 04:45:00.\n", 1224 | "No data between 2016-07-04 04:45:00 and 2016-07-04 05:45:00.\n", 1225 | "No data between 2016-07-04 05:45:00 and 2016-07-04 07:30:00.\n", 1226 | "No data between 2016-07-04 08:15:00 and 2016-07-04 08:45:00.\n", 1227 | "No data between 2016-07-04 09:30:00 and 2016-07-04 10:30:00.\n", 1228 | "No data between 2016-07-04 10:30:00 and 2016-07-04 12:00:00.\n", 1229 | "No data between 2016-07-04 14:00:00 and 2016-07-04 14:45:00.\n", 1230 | "No data between 2016-07-04 15:45:00 and 2016-07-04 16:15:00.\n", 1231 | "No data between 2016-07-04 17:45:00 and 2016-07-04 18:15:00.\n", 1232 | "No data between 2016-07-04 18:45:00 and 2016-07-04 19:15:00.\n", 1233 | "No data between 2016-07-04 19:15:00 and 2016-07-04 19:45:00.\n", 1234 | "No data between 2016-07-04 19:45:00 and 2016-07-04 21:00:00.\n", 1235 | "No data between 2016-07-04 23:00:00 and 2016-07-04 23:30:00.\n", 1236 | "No data between 2016-07-05 00:00:00 and 2016-07-05 00:30:00.\n", 1237 | "No data between 2016-07-05 01:00:00 and 2016-07-05 01:30:00.\n", 1238 | "No data between 2016-07-05 01:30:00 and 2016-07-05 02:15:00.\n", 1239 | "No data between 2016-07-05 02:30:00 and 2016-07-05 03:00:00.\n", 1240 | "No data between 2016-07-05 03:15:00 and 2016-07-05 04:00:00.\n", 1241 | "No data between 2016-07-05 04:45:00 and 2016-07-05 05:15:00.\n", 1242 | "No data between 2016-07-05 05:15:00 and 2016-07-05 05:45:00.\n", 1243 | "No data between 2016-07-05 05:45:00 and 2016-07-05 06:15:00.\n", 1244 | "No data between 2016-07-05 07:30:00 and 2016-07-05 08:15:00.\n", 1245 | "No data between 2016-07-06 01:45:00 and 2016-07-06 03:30:00.\n", 1246 | "No data between 2016-07-06 03:30:00 and 2016-07-06 04:30:00.\n", 1247 | "No data between 2016-07-06 04:45:00 and 2016-07-06 05:30:00.\n", 1248 | "No data between 2016-07-06 06:00:00 and 2016-07-06 06:45:00.\n", 1249 | "No data between 2016-07-06 06:45:00 and 2016-07-06 07:15:00.\n", 1250 | "No data between 2016-07-06 07:15:00 and 2016-07-06 07:45:00.\n", 1251 | "No data between 2016-07-06 08:15:00 and 2016-07-06 09:00:00.\n", 1252 | "No data between 2016-07-06 09:30:00 and 2016-07-06 10:15:00.\n", 1253 | "No data between 2016-07-06 10:15:00 and 2016-07-06 11:15:00.\n", 1254 | "No data between 2016-07-06 11:15:00 and 2016-07-06 12:00:00.\n", 1255 | "No data between 2016-07-06 12:15:00 and 2016-07-06 13:00:00.\n", 1256 | "No data between 2016-07-06 13:15:00 and 2016-07-06 14:00:00.\n", 1257 | "No data between 2016-07-06 19:45:00 and 2016-07-06 20:15:00.\n", 1258 | "No data between 2016-07-06 20:45:00 and 2016-07-06 21:15:00.\n", 1259 | "No data between 2016-07-06 23:15:00 and 2016-07-06 23:45:00.\n", 1260 | "No data between 2016-07-07 02:30:00 and 2016-07-07 03:00:00.\n", 1261 | "No data between 2016-07-07 08:30:00 and 2016-07-07 09:30:00.\n", 1262 | "No data between 2016-07-07 10:00:00 and 2016-07-07 10:30:00.\n", 1263 | "No data between 2016-07-07 10:30:00 and 2016-07-07 11:00:00.\n", 1264 | "No data between 2016-07-07 11:45:00 and 2016-07-07 12:30:00.\n", 1265 | "No data between 2016-07-07 12:30:00 and 2016-07-07 13:00:00.\n", 1266 | "No data between 2016-07-07 15:45:00 and 2016-07-07 16:15:00.\n", 1267 | "No data between 2016-07-07 19:00:00 and 2016-07-07 19:30:00.\n", 1268 | "No data between 2016-07-07 20:45:00 and 2016-07-07 21:15:00.\n", 1269 | "No data between 2016-07-07 22:30:00 and 2016-07-07 23:00:00.\n", 1270 | "No data between 2016-07-07 23:15:00 and 2016-07-07 23:45:00.\n", 1271 | "No data between 2016-07-08 00:15:00 and 2016-07-08 00:45:00.\n", 1272 | "No data between 2016-07-08 01:15:00 and 2016-07-08 01:45:00.\n", 1273 | "No data between 2016-07-08 03:00:00 and 2016-07-08 03:30:00.\n", 1274 | "No data between 2016-07-08 03:45:00 and 2016-07-08 04:45:00.\n", 1275 | "No data between 2016-07-08 04:45:00 and 2016-07-08 05:15:00.\n", 1276 | "No data between 2016-07-08 06:15:00 and 2016-07-08 07:45:00.\n", 1277 | "No data between 2016-07-08 08:15:00 and 2016-07-08 10:00:00.\n", 1278 | "No data between 2016-07-08 10:00:00 and 2016-07-08 11:30:00.\n", 1279 | "No data between 2016-07-08 14:00:00 and 2016-07-08 14:30:00.\n", 1280 | "No data between 2016-07-08 15:30:00 and 2016-07-08 16:00:00.\n", 1281 | "No data between 2016-07-08 16:45:00 and 2016-07-08 17:15:00.\n", 1282 | "No data between 2016-07-08 18:00:00 and 2016-07-08 18:30:00.\n", 1283 | "No data between 2016-07-08 23:30:00 and 2016-07-09 00:00:00.\n", 1284 | "No data between 2016-07-09 00:45:00 and 2016-07-09 01:15:00.\n", 1285 | "No data between 2016-07-09 01:15:00 and 2016-07-09 01:45:00.\n", 1286 | "No data between 2016-07-09 02:00:00 and 2016-07-09 02:30:00.\n", 1287 | "No data between 2016-07-09 04:00:00 and 2016-07-09 04:30:00.\n", 1288 | "No data between 2016-07-09 05:00:00 and 2016-07-09 05:30:00.\n", 1289 | "No data between 2016-07-09 06:00:00 and 2016-07-09 06:45:00.\n", 1290 | "No data between 2016-07-09 06:45:00 and 2016-07-09 08:15:00.\n", 1291 | "No data between 2016-07-09 08:15:00 and 2016-07-09 08:45:00.\n", 1292 | "No data between 2016-07-09 08:45:00 and 2016-07-09 09:45:00.\n", 1293 | "No data between 2016-07-09 10:00:00 and 2016-07-09 11:45:00.\n", 1294 | "No data between 2016-07-09 12:00:00 and 2016-07-09 12:30:00.\n", 1295 | "No data between 2016-07-09 12:45:00 and 2016-07-09 13:15:00.\n", 1296 | "No data between 2016-07-09 13:45:00 and 2016-07-09 14:15:00.\n", 1297 | "No data between 2016-07-09 15:15:00 and 2016-07-09 16:00:00.\n", 1298 | "No data between 2016-07-09 16:30:00 and 2016-07-09 17:15:00.\n", 1299 | "No data between 2016-07-09 17:30:00 and 2016-07-09 18:00:00.\n", 1300 | "No data between 2016-07-09 18:00:00 and 2016-07-09 18:45:00.\n", 1301 | "No data between 2016-07-09 18:45:00 and 2016-07-09 19:30:00.\n", 1302 | "No data between 2016-07-09 20:00:00 and 2016-07-09 20:45:00.\n", 1303 | "No data between 2016-07-09 22:45:00 and 2016-07-09 23:15:00.\n", 1304 | "No data between 2016-07-09 23:15:00 and 2016-07-09 23:45:00.\n", 1305 | "No data between 2016-07-10 02:15:00 and 2016-07-10 02:45:00.\n", 1306 | "No data between 2016-07-10 03:30:00 and 2016-07-10 04:00:00.\n", 1307 | "No data between 2016-07-10 04:30:00 and 2016-07-10 06:45:00.\n", 1308 | "No data between 2016-07-10 06:45:00 and 2016-07-10 07:30:00.\n", 1309 | "No data between 2016-07-10 07:30:00 and 2016-07-10 08:00:00.\n", 1310 | "No data between 2016-07-10 08:30:00 and 2016-07-10 09:30:00.\n", 1311 | "No data between 2016-07-10 10:00:00 and 2016-07-10 13:00:00.\n", 1312 | "No data between 2016-07-10 13:00:00 and 2016-07-10 14:00:00.\n", 1313 | "No data between 2016-07-10 14:00:00 and 2016-07-10 14:30:00.\n", 1314 | "No data between 2016-07-10 15:00:00 and 2016-07-10 15:30:00.\n", 1315 | "No data between 2016-07-10 16:30:00 and 2016-07-10 17:00:00.\n", 1316 | "No data between 2016-07-10 17:00:00 and 2016-07-10 17:30:00.\n", 1317 | "No data between 2016-07-10 17:45:00 and 2016-07-10 18:15:00.\n", 1318 | "No data between 2016-07-10 20:00:00 and 2016-07-10 20:30:00.\n", 1319 | "No data between 2016-07-10 21:00:00 and 2016-07-10 22:00:00.\n", 1320 | "No data between 2016-07-10 22:00:00 and 2016-07-10 23:00:00.\n", 1321 | "No data between 2016-07-10 23:15:00 and 2016-07-11 00:00:00.\n", 1322 | "No data between 2016-07-11 00:00:00 and 2016-07-11 00:30:00.\n", 1323 | "No data between 2016-07-11 00:30:00 and 2016-07-11 01:00:00.\n", 1324 | "No data between 2016-07-11 02:00:00 and 2016-07-11 02:45:00.\n", 1325 | "No data between 2016-07-11 03:15:00 and 2016-07-11 04:15:00.\n", 1326 | "No data between 2016-07-11 04:15:00 and 2016-07-11 05:00:00.\n", 1327 | "No data between 2016-07-11 05:15:00 and 2016-07-11 06:00:00.\n", 1328 | "No data between 2016-07-11 07:15:00 and 2016-07-11 08:15:00.\n", 1329 | "No data between 2016-07-11 09:00:00 and 2016-07-11 09:45:00.\n", 1330 | "No data between 2016-07-11 12:30:00 and 2016-07-11 13:00:00.\n", 1331 | "No data between 2016-07-11 13:30:00 and 2016-07-11 14:15:00.\n", 1332 | "No data between 2016-07-11 18:00:00 and 2016-07-11 18:30:00.\n", 1333 | "No data between 2016-07-11 19:00:00 and 2016-07-11 19:30:00.\n", 1334 | "No data between 2016-07-11 20:30:00 and 2016-07-11 21:30:00.\n", 1335 | "No data between 2016-07-11 21:30:00 and 2016-07-11 22:00:00.\n", 1336 | "No data between 2016-07-11 22:30:00 and 2016-07-11 23:00:00.\n", 1337 | "No data between 2016-07-12 04:00:00 and 2016-07-12 04:30:00.\n", 1338 | "No data between 2016-07-12 04:30:00 and 2016-07-12 05:15:00.\n", 1339 | "No data between 2016-07-12 07:45:00 and 2016-07-12 08:15:00.\n", 1340 | "No data between 2016-07-12 08:15:00 and 2016-07-12 09:00:00.\n", 1341 | "No data between 2016-07-12 09:00:00 and 2016-07-12 10:00:00.\n", 1342 | "No data between 2016-07-12 10:15:00 and 2016-07-12 10:45:00.\n", 1343 | "No data between 2016-07-12 11:00:00 and 2016-07-12 12:00:00.\n", 1344 | "No data between 2016-07-12 12:00:00 and 2016-07-12 13:00:00.\n", 1345 | "No data between 2016-07-12 13:00:00 and 2016-07-12 13:30:00.\n", 1346 | "No data between 2016-07-12 14:15:00 and 2016-07-12 14:45:00.\n", 1347 | "No data between 2016-07-12 18:15:00 and 2016-07-12 19:00:00.\n", 1348 | "No data between 2016-07-13 01:00:00 and 2016-07-13 03:00:00.\n", 1349 | "No data between 2016-07-13 03:15:00 and 2016-07-13 04:30:00.\n", 1350 | "No data between 2016-07-13 04:45:00 and 2016-07-13 05:15:00.\n", 1351 | "No data between 2016-07-13 05:30:00 and 2016-07-13 06:30:00.\n", 1352 | "No data between 2016-07-13 06:30:00 and 2016-07-13 07:00:00.\n", 1353 | "No data between 2016-07-13 07:15:00 and 2016-07-13 09:15:00.\n", 1354 | "No data between 2016-07-13 09:15:00 and 2016-07-13 11:00:00.\n", 1355 | "No data between 2016-07-13 11:00:00 and 2016-07-13 13:30:00.\n", 1356 | "No data between 2016-07-13 14:00:00 and 2016-07-13 15:00:00.\n", 1357 | "No data between 2016-07-13 15:00:00 and 2016-07-13 15:30:00.\n", 1358 | "No data between 2016-07-13 15:30:00 and 2016-07-13 16:15:00.\n", 1359 | "No data between 2016-07-13 16:30:00 and 2016-07-13 17:00:00.\n", 1360 | "No data between 2016-07-13 17:00:00 and 2016-07-13 17:30:00.\n", 1361 | "No data between 2016-07-13 17:30:00 and 2016-07-13 18:00:00.\n", 1362 | "No data between 2016-07-13 20:45:00 and 2016-07-13 22:15:00.\n", 1363 | "No data between 2016-07-13 22:15:00 and 2016-07-13 22:45:00.\n", 1364 | "No data between 2016-07-13 23:15:00 and 2016-07-13 23:45:00.\n", 1365 | "No data between 2016-07-14 04:45:00 and 2016-07-14 05:45:00.\n", 1366 | "No data between 2016-07-14 05:45:00 and 2016-07-14 06:15:00.\n", 1367 | "No data between 2016-07-14 07:15:00 and 2016-07-14 07:45:00.\n", 1368 | "No data between 2016-07-14 09:15:00 and 2016-07-14 10:15:00.\n", 1369 | "No data between 2016-07-14 10:15:00 and 2016-07-14 12:15:00.\n", 1370 | "No data between 2016-07-14 12:45:00 and 2016-07-14 13:15:00.\n", 1371 | "No data between 2016-07-14 13:30:00 and 2016-07-14 14:00:00.\n", 1372 | "No data between 2016-07-14 14:15:00 and 2016-07-14 15:00:00.\n", 1373 | "No data between 2016-07-14 15:00:00 and 2016-07-14 15:30:00.\n", 1374 | "No data between 2016-07-14 23:45:00 and 2016-07-15 00:15:00.\n", 1375 | "No data between 2016-07-15 01:45:00 and 2016-07-15 02:15:00.\n", 1376 | "No data between 2016-07-15 05:30:00 and 2016-07-15 06:00:00.\n", 1377 | "No data between 2016-07-15 07:15:00 and 2016-07-15 08:00:00.\n", 1378 | "No data between 2016-07-15 08:15:00 and 2016-07-15 09:00:00.\n", 1379 | "No data between 2016-07-15 09:45:00 and 2016-07-15 10:15:00.\n", 1380 | "No data between 2016-07-15 15:45:00 and 2016-07-15 16:15:00.\n", 1381 | "No data between 2016-07-15 18:15:00 and 2016-07-15 18:45:00.\n", 1382 | "No data between 2016-07-16 00:15:00 and 2016-07-16 00:45:00.\n", 1383 | "No data between 2016-07-16 02:00:00 and 2016-07-16 02:30:00.\n", 1384 | "No data between 2016-07-16 05:30:00 and 2016-07-16 06:00:00.\n", 1385 | "No data between 2016-07-16 06:15:00 and 2016-07-16 06:45:00.\n", 1386 | "No data between 2016-07-16 07:45:00 and 2016-07-16 08:30:00.\n", 1387 | "No data between 2016-07-16 08:30:00 and 2016-07-16 09:30:00.\n", 1388 | "No data between 2016-07-16 09:30:00 and 2016-07-16 10:00:00.\n", 1389 | "No data between 2016-07-16 10:00:00 and 2016-07-16 11:00:00.\n", 1390 | "No data between 2016-07-16 11:15:00 and 2016-07-16 11:45:00.\n", 1391 | "No data between 2016-07-16 11:45:00 and 2016-07-16 12:15:00.\n", 1392 | "No data between 2016-07-16 13:00:00 and 2016-07-16 14:15:00.\n", 1393 | "No data between 2016-07-16 15:00:00 and 2016-07-16 15:30:00.\n", 1394 | "No data between 2016-07-16 15:30:00 and 2016-07-16 16:00:00.\n", 1395 | "No data between 2016-07-16 18:15:00 and 2016-07-16 18:45:00.\n", 1396 | "No data between 2016-07-16 19:45:00 and 2016-07-16 20:15:00.\n", 1397 | "No data between 2016-07-16 21:00:00 and 2016-07-16 21:30:00.\n", 1398 | "No data between 2016-07-16 23:30:00 and 2016-07-17 00:15:00.\n", 1399 | "No data between 2016-07-17 03:00:00 and 2016-07-17 03:30:00.\n", 1400 | "No data between 2016-07-17 07:15:00 and 2016-07-17 08:00:00.\n", 1401 | "No data between 2016-07-17 08:00:00 and 2016-07-17 08:30:00.\n", 1402 | "No data between 2016-07-17 08:30:00 and 2016-07-17 09:30:00.\n", 1403 | "No data between 2016-07-17 09:30:00 and 2016-07-17 10:00:00.\n", 1404 | "No data between 2016-07-17 10:00:00 and 2016-07-17 12:00:00.\n", 1405 | "No data between 2016-07-17 13:30:00 and 2016-07-17 14:00:00.\n", 1406 | "No data between 2016-07-17 14:00:00 and 2016-07-17 14:30:00.\n", 1407 | "No data between 2016-07-17 16:45:00 and 2016-07-17 17:30:00.\n", 1408 | "No data between 2016-07-17 22:30:00 and 2016-07-17 23:00:00.\n", 1409 | "No data between 2016-07-17 23:45:00 and 2016-07-18 00:15:00.\n", 1410 | "No data between 2016-07-18 00:45:00 and 2016-07-18 01:15:00.\n", 1411 | "No data between 2016-07-18 01:15:00 and 2016-07-18 01:45:00.\n", 1412 | "No data between 2016-07-18 04:15:00 and 2016-07-18 05:15:00.\n", 1413 | "No data between 2016-07-18 05:15:00 and 2016-07-18 05:45:00.\n", 1414 | "No data between 2016-07-18 05:45:00 and 2016-07-18 06:15:00.\n", 1415 | "No data between 2016-07-18 07:30:00 and 2016-07-18 08:15:00.\n", 1416 | "No data between 2016-07-18 08:15:00 and 2016-07-18 08:45:00.\n", 1417 | "No data between 2016-07-18 08:45:00 and 2016-07-18 09:30:00.\n", 1418 | "No data between 2016-07-18 10:15:00 and 2016-07-18 11:15:00.\n", 1419 | "No data between 2016-07-18 11:30:00 and 2016-07-18 12:00:00.\n", 1420 | "No data between 2016-07-18 12:00:00 and 2016-07-18 13:00:00.\n", 1421 | "No data between 2016-07-18 16:00:00 and 2016-07-18 16:30:00.\n", 1422 | "No data between 2016-07-18 17:00:00 and 2016-07-18 17:30:00.\n", 1423 | "No data between 2016-07-18 18:45:00 and 2016-07-18 19:30:00.\n", 1424 | "No data between 2016-07-18 20:45:00 and 2016-07-18 21:15:00.\n", 1425 | "No data between 2016-07-18 21:15:00 and 2016-07-18 21:45:00.\n", 1426 | "No data between 2016-07-19 00:15:00 and 2016-07-19 00:45:00.\n", 1427 | "No data between 2016-07-19 02:30:00 and 2016-07-19 03:00:00.\n", 1428 | "No data between 2016-07-19 04:15:00 and 2016-07-19 04:45:00.\n", 1429 | "No data between 2016-07-19 04:45:00 and 2016-07-19 05:15:00.\n", 1430 | "No data between 2016-07-19 06:15:00 and 2016-07-19 06:45:00.\n", 1431 | "No data between 2016-07-19 06:45:00 and 2016-07-19 07:15:00.\n", 1432 | "No data between 2016-07-19 07:15:00 and 2016-07-19 08:00:00.\n", 1433 | "No data between 2016-07-19 08:00:00 and 2016-07-19 09:00:00.\n", 1434 | "No data between 2016-07-19 09:00:00 and 2016-07-19 09:30:00.\n", 1435 | "No data between 2016-07-19 09:30:00 and 2016-07-19 10:00:00.\n", 1436 | "No data between 2016-07-19 10:00:00 and 2016-07-19 10:45:00.\n", 1437 | "No data between 2016-07-19 10:45:00 and 2016-07-19 11:45:00.\n", 1438 | "No data between 2016-07-19 12:00:00 and 2016-07-19 12:30:00.\n", 1439 | "No data between 2016-07-19 13:00:00 and 2016-07-19 14:00:00.\n", 1440 | "No data between 2016-07-19 14:15:00 and 2016-07-19 15:00:00.\n", 1441 | "No data between 2016-07-19 15:00:00 and 2016-07-19 15:30:00.\n", 1442 | "No data between 2016-07-19 15:30:00 and 2016-07-19 16:00:00.\n", 1443 | "No data between 2016-07-19 17:15:00 and 2016-07-19 17:45:00.\n", 1444 | "No data between 2016-07-20 02:30:00 and 2016-07-20 03:00:00.\n", 1445 | "No data between 2016-07-20 06:15:00 and 2016-07-20 06:45:00.\n", 1446 | "No data between 2016-07-20 07:15:00 and 2016-07-20 07:45:00.\n", 1447 | "No data between 2016-07-20 07:45:00 and 2016-07-20 08:30:00.\n", 1448 | "No data between 2016-07-20 08:45:00 and 2016-07-20 10:15:00.\n", 1449 | "No data between 2016-07-20 10:15:00 and 2016-07-20 10:45:00.\n", 1450 | "No data between 2016-07-21 03:00:00 and 2016-07-21 03:30:00.\n", 1451 | "No data between 2016-07-21 04:00:00 and 2016-07-21 04:30:00.\n", 1452 | "No data between 2016-07-21 05:15:00 and 2016-07-21 05:45:00.\n", 1453 | "No data between 2016-07-21 07:00:00 and 2016-07-21 07:30:00.\n", 1454 | "No data between 2016-07-21 07:30:00 and 2016-07-21 08:00:00.\n", 1455 | "No data between 2016-07-21 08:00:00 and 2016-07-21 08:30:00.\n", 1456 | "No data between 2016-07-21 09:00:00 and 2016-07-21 09:30:00.\n", 1457 | "No data between 2016-07-21 10:15:00 and 2016-07-21 10:45:00.\n", 1458 | "No data between 2016-07-21 12:15:00 and 2016-07-21 12:45:00.\n", 1459 | "No data between 2016-07-24 17:45:00 and 2016-07-24 18:15:00.\n", 1460 | "No data between 2016-08-10 10:45:00 and 2016-08-10 11:15:00.\n", 1461 | "No data between 2016-08-22 08:15:00 and 2016-08-22 08:45:00.\n", 1462 | "No data between 2016-08-22 09:15:00 and 2016-08-22 09:45:00.\n", 1463 | "No data between 2016-08-26 22:15:00 and 2016-08-26 22:45:00.\n", 1464 | "No data between 2016-09-19 02:15:00 and 2016-09-19 02:45:00.\n", 1465 | "No data between 2016-09-19 02:45:00 and 2016-09-19 05:15:00.\n" 1466 | ] 1467 | }, 1468 | { 1469 | "name": "stdout", 1470 | "output_type": "stream", 1471 | "text": [ 1472 | "No data between 2016-10-02 09:45:00 and 2016-10-02 10:15:00.\n", 1473 | "No data between 2016-10-02 10:15:00 and 2016-10-02 10:45:00.\n", 1474 | "No data between 2016-10-05 04:15:00 and 2016-10-05 04:45:00.\n", 1475 | "No data between 2016-10-14 21:15:00 and 2016-10-14 21:45:00.\n", 1476 | "No data between 2016-10-18 02:00:00 and 2016-10-18 02:30:00.\n", 1477 | "No data between 2016-10-19 06:15:00 and 2016-10-19 06:45:00.\n", 1478 | "No data between 2016-10-20 09:45:00 and 2016-10-20 10:15:00.\n", 1479 | "No data between 2016-10-21 08:45:00 and 2016-10-21 09:15:00.\n", 1480 | "No data between 2016-10-24 09:00:00 and 2016-10-24 09:30:00.\n", 1481 | "No data between 2016-11-06 06:15:00 and 2016-11-06 06:45:00.\n", 1482 | "No data between 2016-11-27 00:15:00 and 2016-11-27 00:45:00.\n", 1483 | "No data between 2016-11-30 18:30:00 and 2016-11-30 19:00:00.\n", 1484 | "No data between 2016-12-01 01:00:00 and 2016-12-01 06:15:00.\n", 1485 | "No data between 2016-12-11 10:45:00 and 2016-12-11 11:15:00.\n", 1486 | "No data between 2016-12-16 08:15:00 and 2016-12-16 08:45:00.\n", 1487 | "No data between 2016-12-16 10:00:00 and 2016-12-16 10:30:00.\n", 1488 | "No data between 2017-01-12 05:00:00 and 2017-01-12 05:30:00.\n", 1489 | "No data between 2017-01-13 00:15:00 and 2017-01-13 00:45:00.\n", 1490 | "No data between 2017-01-14 00:45:00 and 2017-01-14 01:15:00.\n", 1491 | "No data between 2017-01-14 08:00:00 and 2017-01-14 08:30:00.\n", 1492 | "No data between 2017-01-14 09:15:00 and 2017-01-14 10:00:00.\n", 1493 | "No data between 2017-01-14 18:45:00 and 2017-01-14 19:15:00.\n", 1494 | "No data between 2017-01-15 01:30:00 and 2017-01-15 02:00:00.\n", 1495 | "No data between 2017-01-15 03:30:00 and 2017-01-15 04:00:00.\n", 1496 | "No data between 2017-01-15 06:45:00 and 2017-01-15 07:15:00.\n", 1497 | "No data between 2017-01-15 08:45:00 and 2017-01-15 09:30:00.\n", 1498 | "No data between 2017-01-15 11:30:00 and 2017-01-15 12:00:00.\n", 1499 | "No data between 2017-01-15 17:00:00 and 2017-01-15 17:30:00.\n", 1500 | "No data between 2017-01-15 22:45:00 and 2017-01-15 23:15:00.\n", 1501 | "No data between 2017-01-16 05:30:00 and 2017-01-16 06:00:00.\n", 1502 | "No data between 2017-01-16 07:45:00 and 2017-01-16 08:15:00.\n", 1503 | "No data between 2017-01-16 08:30:00 and 2017-01-16 09:00:00.\n", 1504 | "No data between 2017-01-16 09:00:00 and 2017-01-16 10:00:00.\n", 1505 | "No data between 2017-01-16 12:30:00 and 2017-01-16 13:00:00.\n", 1506 | "No data between 2017-01-16 16:45:00 and 2017-01-16 17:15:00.\n", 1507 | "No data between 2017-01-17 00:45:00 and 2017-01-17 01:15:00.\n", 1508 | "No data between 2017-01-17 10:00:00 and 2017-01-17 10:30:00.\n", 1509 | "No data between 2017-01-17 12:00:00 and 2017-01-17 12:30:00.\n", 1510 | "No data between 2017-01-18 05:15:00 and 2017-01-18 05:45:00.\n", 1511 | "No data between 2017-01-18 11:00:00 and 2017-01-18 11:30:00.\n", 1512 | "No data between 2017-01-18 11:45:00 and 2017-01-18 12:15:00.\n", 1513 | "No data between 2017-01-18 22:30:00 and 2017-01-18 23:00:00.\n", 1514 | "No data between 2017-01-19 06:15:00 and 2017-01-19 06:45:00.\n", 1515 | "No data between 2017-01-19 09:00:00 and 2017-01-19 09:30:00.\n", 1516 | "No data between 2017-01-19 09:30:00 and 2017-01-19 10:00:00.\n", 1517 | "No data between 2017-01-19 10:00:00 and 2017-01-19 10:30:00.\n", 1518 | "No data between 2017-01-19 10:45:00 and 2017-01-19 11:15:00.\n", 1519 | "No data between 2017-01-19 11:45:00 and 2017-01-19 12:15:00.\n", 1520 | "No data between 2017-01-19 12:15:00 and 2017-01-19 12:45:00.\n", 1521 | "No data between 2017-01-19 12:45:00 and 2017-01-19 13:15:00.\n", 1522 | "No data between 2017-01-19 14:00:00 and 2017-01-19 14:30:00.\n", 1523 | "No data between 2017-01-19 18:45:00 and 2017-01-19 19:15:00.\n", 1524 | "No data between 2017-01-23 20:45:00 and 2017-01-23 21:15:00.\n", 1525 | "No data between 2017-01-23 21:15:00 and 2017-01-23 22:00:00.\n", 1526 | "No data between 2017-01-23 22:00:00 and 2017-01-23 22:45:00.\n", 1527 | "No data between 2017-01-24 03:00:00 and 2017-01-24 03:30:00.\n", 1528 | "No data between 2017-01-24 03:30:00 and 2017-01-24 04:00:00.\n", 1529 | "No data between 2017-01-24 04:15:00 and 2017-01-24 04:45:00.\n", 1530 | "No data between 2017-01-24 04:45:00 and 2017-01-24 05:15:00.\n", 1531 | "No data between 2017-01-24 06:30:00 and 2017-01-24 07:00:00.\n", 1532 | "No data between 2017-01-24 07:30:00 and 2017-01-24 09:00:00.\n", 1533 | "No data between 2017-01-24 09:00:00 and 2017-01-24 09:30:00.\n", 1534 | "No data between 2017-01-24 09:30:00 and 2017-01-24 10:00:00.\n", 1535 | "No data between 2017-01-24 10:45:00 and 2017-01-24 11:30:00.\n", 1536 | "No data between 2017-01-24 11:30:00 and 2017-01-24 12:00:00.\n", 1537 | "No data between 2017-02-28 19:30:00 and 2017-03-01 01:30:00.\n", 1538 | "No data between 2017-03-02 19:00:00 and 2017-03-02 20:15:00.\n", 1539 | "No data between 2017-04-15 19:00:00 and 2017-04-15 23:00:00.\n", 1540 | "No data between 2017-06-21 20:00:00 and 2017-06-21 23:00:00.\n", 1541 | "No data between 2017-06-26 17:00:00 and 2017-06-26 17:45:00.\n", 1542 | "No data between 2017-07-18 20:45:00 and 2017-07-18 21:15:00.\n", 1543 | "No data between 2017-09-01 05:00:00 and 2017-09-01 05:30:00.\n", 1544 | "No data between 2017-09-25 08:15:00 and 2017-09-25 10:45:00.\n", 1545 | "No data between 2017-10-29 01:45:00 and 2017-10-29 02:45:00.\n", 1546 | "No data between 2017-12-01 06:30:00 and 2017-12-01 08:00:00.\n", 1547 | "No data between 2017-12-07 16:45:00 and 2017-12-07 17:15:00.\n", 1548 | "No data between 2017-12-11 19:15:00 and 2017-12-11 19:45:00.\n", 1549 | "No data between 2017-12-12 05:45:00 and 2017-12-12 07:15:00.\n", 1550 | "No data between 2017-12-22 17:45:00 and 2017-12-22 18:15:00.\n" 1551 | ] 1552 | } 1553 | ], 1554 | "source": [ 1555 | "df_year = pd.read_pickle(\"data/ETH_USD_2016_2018_15min.pkl\")\n", 1556 | "\n", 1557 | "# Checking for missing data\n", 1558 | "delta = datetime.timedelta(minutes=15)\n", 1559 | "for i, row in df_year.iterrows():\n", 1560 | " if i < len(df_year.index)-1:\n", 1561 | " current_date = df_year.iloc[i]\n", 1562 | " next_date = df_year.iloc[i+1]\n", 1563 | " if next_date[\"time\"] - current_date[\"time\"] > delta:\n", 1564 | " print(\"No data between {} and {}.\".format(current_date[\"time\"], next_date[\"time\"]))\n", 1565 | "for i, row in df_year.iterrows():\n", 1566 | " if i < len(df_year.index)-1:\n", 1567 | " current_date = df_year.iloc[i]\n", 1568 | " next_date = df_year.iloc[i+1]\n", 1569 | " if next_date[\"time\"] < current_date[\"time\"]:\n", 1570 | " print(\"Wrong order between {} and {}.\".format(current_date[\"time\"], next_date[\"time\"]))\n", 1571 | " " 1572 | ] 1573 | }, 1574 | { 1575 | "cell_type": "code", 1576 | "execution_count": 5, 1577 | "metadata": {}, 1578 | "outputs": [ 1579 | { 1580 | "data": { 1581 | "image/png": "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\n", 1582 | "text/plain": [ 1583 | "" 1584 | ] 1585 | }, 1586 | "metadata": {}, 1587 | "output_type": "display_data" 1588 | } 1589 | ], 1590 | "source": [ 1591 | "plt.plot(df_year.time,df_year.open, label = \"Open values\")\n", 1592 | "plt.legend(loc='upper left')\n", 1593 | "plt.show()" 1594 | ] 1595 | }, 1596 | { 1597 | "cell_type": "code", 1598 | "execution_count": 14, 1599 | "metadata": {}, 1600 | "outputs": [ 1601 | { 1602 | "name": "stdout", 1603 | "output_type": "stream", 1604 | "text": [ 1605 | "2018-03-06 19:30:00\n" 1606 | ] 1607 | }, 1608 | { 1609 | "data": { 1610 | "text/html": [ 1611 | "
\n", 1612 | "\n", 1625 | "\n", 1626 | " \n", 1627 | " \n", 1628 | " \n", 1629 | " \n", 1630 | " \n", 1631 | " \n", 1632 | " \n", 1633 | " \n", 1634 | " \n", 1635 | " \n", 1636 | " \n", 1637 | " \n", 1638 | " \n", 1639 | " \n", 1640 | " \n", 1641 | " \n", 1642 | " \n", 1643 | " \n", 1644 | " \n", 1645 | " \n", 1646 | " \n", 1647 | " \n", 1648 | " \n", 1649 | " \n", 1650 | " \n", 1651 | " \n", 1652 | " \n", 1653 | " \n", 1654 | " \n", 1655 | " \n", 1656 | " \n", 1657 | " \n", 1658 | " \n", 1659 | " \n", 1660 | " \n", 1661 | " \n", 1662 | " \n", 1663 | " \n", 1664 | " \n", 1665 | " \n", 1666 | " \n", 1667 | " \n", 1668 | " \n", 1669 | " \n", 1670 | " \n", 1671 | " \n", 1672 | " \n", 1673 | " \n", 1674 | " \n", 1675 | " \n", 1676 | " \n", 1677 | " \n", 1678 | " \n", 1679 | " \n", 1680 | " \n", 1681 | " \n", 1682 | " \n", 1683 | " \n", 1684 | " \n", 1685 | " \n", 1686 | " \n", 1687 | " \n", 1688 | " \n", 1689 | " \n", 1690 | " \n", 1691 | " \n", 1692 | " \n", 1693 | " \n", 1694 | " \n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \n", 1744 | " \n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | " \n", 1751 | " \n", 1752 | " \n", 1753 | " \n", 1754 | " \n", 1755 | " \n", 1756 | " \n", 1757 | " \n", 1758 | " \n", 1759 | " \n", 1760 | " \n", 1761 | " \n", 1762 | " \n", 1763 | " \n", 1764 | " \n", 1765 | " \n", 1766 | " \n", 1767 | " \n", 1768 | " \n", 1769 | " \n", 1770 | " \n", 1771 | " \n", 1772 | " \n", 1773 | " \n", 1774 | " \n", 1775 | " \n", 1776 | " \n", 1777 | " \n", 1778 | " \n", 1779 | " \n", 1780 | " \n", 1781 | " \n", 1782 | " \n", 1783 | " \n", 1784 | " \n", 1785 | " \n", 1786 | " \n", 1787 | " \n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | " \n", 1854 | " \n", 1855 | " \n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | " \n", 1916 | " \n", 1917 | " \n", 1918 | " \n", 1919 | " \n", 1920 | " \n", 1921 | " \n", 1922 | " \n", 1923 | " \n", 1924 | " \n", 1925 | " \n", 1926 | " \n", 1927 | " \n", 1928 | " \n", 1929 | " \n", 1930 | " \n", 1931 | " \n", 1932 | " \n", 1933 | " \n", 1934 | " \n", 1935 | " \n", 1936 | " \n", 1937 | " \n", 1938 | " \n", 1939 | " \n", 1940 | " \n", 1941 | " \n", 1942 | " \n", 1943 | " \n", 1944 | " \n", 1945 | " \n", 1946 | " \n", 1947 | " \n", 1948 | " \n", 1949 | " \n", 1950 | " \n", 1951 | " \n", 1952 | " \n", 1953 | " \n", 1954 | " \n", 1955 | " \n", 1956 | " \n", 1957 | " \n", 1958 | " \n", 1959 | " \n", 1960 | " \n", 1961 | " \n", 1962 | " \n", 1963 | " \n", 1964 | " \n", 1965 | " \n", 1966 | " \n", 1967 | " \n", 1968 | " \n", 1969 | " \n", 1970 | " \n", 1971 | " \n", 1972 | " \n", 1973 | " \n", 1974 | " \n", 1975 | " \n", 1976 | " \n", 1977 | " \n", 1978 | " \n", 1979 | " \n", 1980 | " \n", 1981 | " \n", 1982 | " \n", 1983 | " \n", 1984 | " \n", 1985 | " \n", 1986 | " \n", 1987 | " \n", 1988 | " \n", 1989 | " \n", 1990 | " \n", 1991 | " \n", 1992 | " \n", 1993 | " \n", 1994 | " \n", 1995 | " \n", 1996 | " \n", 1997 | " \n", 1998 | " \n", 1999 | " \n", 2000 | " \n", 2001 | " \n", 2002 | " \n", 2003 | " \n", 2004 | " \n", 2005 | " \n", 2006 | " \n", 2007 | " \n", 2008 | " \n", 2009 | " \n", 2010 | " \n", 2011 | " \n", 2012 | " \n", 2013 | " \n", 2014 | " \n", 2015 | " \n", 2016 | " \n", 2017 | " \n", 2018 | " \n", 2019 | " \n", 2020 | " \n", 2021 | " \n", 2022 | " \n", 2023 | " \n", 2024 | " \n", 2025 | " \n", 2026 | " \n", 2027 | " \n", 2028 | " \n", 2029 | " \n", 2030 | " \n", 2031 | " \n", 2032 | " \n", 2033 | " \n", 2034 | " \n", 2035 | " \n", 2036 | " \n", 2037 | " \n", 2038 | " \n", 2039 | " \n", 2040 | " \n", 2041 | " \n", 2042 | " \n", 2043 | " \n", 2044 | " \n", 2045 | " \n", 2046 | " \n", 2047 | " \n", 2048 | " \n", 2049 | " \n", 2050 | " \n", 2051 | " \n", 2052 | " \n", 2053 | " \n", 2054 | " \n", 2055 | " \n", 2056 | " \n", 2057 | " \n", 2058 | " \n", 2059 | " \n", 2060 | " \n", 2061 | " \n", 2062 | " \n", 2063 | " \n", 2064 | " \n", 2065 | " \n", 2066 | " \n", 2067 | " \n", 2068 | " \n", 2069 | " \n", 2070 | " \n", 2071 | " \n", 2072 | " \n", 2073 | " \n", 2074 | " \n", 2075 | " \n", 2076 | " \n", 2077 | " \n", 2078 | " \n", 2079 | " \n", 2080 | " \n", 2081 | " \n", 2082 | " \n", 2083 | " \n", 2084 | " \n", 2085 | " \n", 2086 | " \n", 2087 | " \n", 2088 | " \n", 2089 | " \n", 2090 | " \n", 2091 | " \n", 2092 | " \n", 2093 | " \n", 2094 | " \n", 2095 | " \n", 2096 | " \n", 2097 | " \n", 2098 | " \n", 2099 | " \n", 2100 | " \n", 2101 | " \n", 2102 | " \n", 2103 | " \n", 2104 | " \n", 2105 | " \n", 2106 | " \n", 2107 | " \n", 2108 | " \n", 2109 | " \n", 2110 | " \n", 2111 | " \n", 2112 | " \n", 2113 | " \n", 2114 | " \n", 2115 | " \n", 2116 | " \n", 2117 | " \n", 2118 | " \n", 2119 | " \n", 2120 | " \n", 2121 | " \n", 2122 | " \n", 2123 | " \n", 2124 | " \n", 2125 | " \n", 2126 | " \n", 2127 | " \n", 2128 | " \n", 2129 | " \n", 2130 | " \n", 2131 | " \n", 2132 | " \n", 2133 | " \n", 2134 | " \n", 2135 | " \n", 2136 | " \n", 2137 | " \n", 2138 | " \n", 2139 | " \n", 2140 | " \n", 2141 | " \n", 2142 | " \n", 2143 | " \n", 2144 | " \n", 2145 | " \n", 2146 | " \n", 2147 | " \n", 2148 | " \n", 2149 | " \n", 2150 | " \n", 2151 | " \n", 2152 | " \n", 2153 | " \n", 2154 | " \n", 2155 | " \n", 2156 | " \n", 2157 | " \n", 2158 | " \n", 2159 | " \n", 2160 | " \n", 2161 | " \n", 2162 | " \n", 2163 | " \n", 2164 | " \n", 2165 | " \n", 2166 | " \n", 2167 | " \n", 2168 | " \n", 2169 | " \n", 2170 | " \n", 2171 | " \n", 2172 | " \n", 2173 | " \n", 2174 | " \n", 2175 | " \n", 2176 | " \n", 2177 | " \n", 2178 | " \n", 2179 | " \n", 2180 | " \n", 2181 | " \n", 2182 | " \n", 2183 | " \n", 2184 | " \n", 2185 | " \n", 2186 | " \n", 2187 | " \n", 2188 | "
timelowhighopenclosevolume
02018-03-05 18:30:00856.48856.49856.49856.4843.935593
12018-03-05 18:45:00856.48859.81856.48858.86766.554688
22018-03-05 19:00:00858.85860.00858.86859.74645.814996
32018-03-05 19:15:00859.00859.76859.75859.54363.956895
42018-03-05 19:30:00856.09859.72859.72856.09478.473793
52018-03-05 19:45:00853.86857.07856.09855.51630.221570
62018-03-05 20:00:00855.35856.87855.51855.56405.935938
72018-03-05 20:15:00854.65856.40855.56854.66515.947029
82018-03-05 20:30:00852.70854.66854.66853.00660.237229
92018-03-05 20:45:00852.01853.39852.99853.06674.913281
102018-03-05 21:00:00853.05853.39853.05853.39353.052420
112018-03-05 21:15:00853.05853.39853.39853.07335.011459
122018-03-05 21:30:00850.00853.07853.06851.601312.261316
132018-03-05 21:45:00851.00852.76851.61852.65639.853622
142018-03-05 22:00:00851.37854.09852.64853.63585.624937
152018-03-05 22:15:00852.71854.61853.54854.31260.135859
162018-03-05 22:30:00853.67854.31854.30854.18329.971765
172018-03-05 22:45:00852.70854.50854.19853.93252.594546
182018-03-05 23:00:00853.42854.50853.76853.42305.443990
192018-03-05 23:15:00851.51853.43853.43852.45378.303331
202018-03-05 23:30:00851.51852.68852.46852.04295.210846
212018-03-05 23:45:00848.83852.38852.05848.831002.927028
222018-03-06 00:00:00845.00848.83848.83845.011060.817136
232018-03-06 00:15:00841.50845.01845.01841.511580.089714
242018-03-06 00:30:00841.27842.72841.51841.28864.545325
252018-03-06 00:45:00841.20841.30841.28841.21732.524099
262018-03-06 01:00:00839.00841.21841.21839.101278.663657
272018-03-06 01:15:00838.88839.50839.10838.95338.720061
282018-03-06 01:30:00838.95841.00838.95840.00674.456015
292018-03-06 01:45:00839.99842.92840.00842.75549.472468
.....................
702018-03-06 12:00:00833.34834.96833.34833.50326.062875
712018-03-06 12:15:00830.00834.24833.50830.01333.174393
722018-03-06 12:30:00828.75831.00830.01829.64449.343862
732018-03-06 12:45:00828.60830.38829.65830.26371.290560
742018-03-06 13:00:00829.00830.26830.26829.00454.789752
752018-03-06 13:15:00828.00829.75829.01828.00371.369208
762018-03-06 13:30:00823.18828.00828.00823.18731.498006
772018-03-06 13:45:00821.00824.81823.18824.46682.935872
782018-03-06 14:00:00822.20824.50824.00823.38406.937281
792018-03-06 14:15:00822.68825.00823.38823.901052.106272
802018-03-06 14:30:00823.62829.42823.87829.41776.623191
812018-03-06 14:45:00829.00829.42829.42829.40579.413136
822018-03-06 15:00:00829.38829.42829.40829.42479.022323
832018-03-06 15:15:00829.40830.00829.42829.96618.087375
842018-03-06 15:30:00829.96831.00829.97830.51383.885179
852018-03-06 15:45:00830.51831.15830.51831.15423.077223
862018-03-06 16:00:00830.00831.51831.14830.01753.964558
872018-03-06 16:15:00827.00830.01830.00827.14684.248704
882018-03-06 16:30:00826.42828.57827.23828.37606.958136
892018-03-06 16:45:00827.07828.38828.38827.07345.303085
902018-03-06 17:00:00823.50827.39827.07824.61932.804091
912018-03-06 17:15:00820.00825.13824.79820.751280.534398
922018-03-06 17:30:00816.30820.22820.22819.441405.331856
932018-03-06 17:45:00816.01819.44819.44816.731306.261941
942018-03-06 18:00:00816.44821.99816.44821.21920.348629
952018-03-06 18:15:00820.92822.50821.21820.98407.356682
962018-03-06 18:30:00818.00820.99820.99819.00548.444364
972018-03-06 18:45:00811.81819.00819.00811.991455.093729
982018-03-06 19:00:00804.45812.00812.00807.092371.577347
992018-03-06 19:15:00803.53809.99807.10804.151528.919896
\n", 2189 | "

100 rows × 6 columns

\n", 2190 | "
" 2191 | ], 2192 | "text/plain": [ 2193 | " time low high open close volume\n", 2194 | "0 2018-03-05 18:30:00 856.48 856.49 856.49 856.48 43.935593\n", 2195 | "1 2018-03-05 18:45:00 856.48 859.81 856.48 858.86 766.554688\n", 2196 | "2 2018-03-05 19:00:00 858.85 860.00 858.86 859.74 645.814996\n", 2197 | "3 2018-03-05 19:15:00 859.00 859.76 859.75 859.54 363.956895\n", 2198 | "4 2018-03-05 19:30:00 856.09 859.72 859.72 856.09 478.473793\n", 2199 | "5 2018-03-05 19:45:00 853.86 857.07 856.09 855.51 630.221570\n", 2200 | "6 2018-03-05 20:00:00 855.35 856.87 855.51 855.56 405.935938\n", 2201 | "7 2018-03-05 20:15:00 854.65 856.40 855.56 854.66 515.947029\n", 2202 | "8 2018-03-05 20:30:00 852.70 854.66 854.66 853.00 660.237229\n", 2203 | "9 2018-03-05 20:45:00 852.01 853.39 852.99 853.06 674.913281\n", 2204 | "10 2018-03-05 21:00:00 853.05 853.39 853.05 853.39 353.052420\n", 2205 | "11 2018-03-05 21:15:00 853.05 853.39 853.39 853.07 335.011459\n", 2206 | "12 2018-03-05 21:30:00 850.00 853.07 853.06 851.60 1312.261316\n", 2207 | "13 2018-03-05 21:45:00 851.00 852.76 851.61 852.65 639.853622\n", 2208 | "14 2018-03-05 22:00:00 851.37 854.09 852.64 853.63 585.624937\n", 2209 | "15 2018-03-05 22:15:00 852.71 854.61 853.54 854.31 260.135859\n", 2210 | "16 2018-03-05 22:30:00 853.67 854.31 854.30 854.18 329.971765\n", 2211 | "17 2018-03-05 22:45:00 852.70 854.50 854.19 853.93 252.594546\n", 2212 | "18 2018-03-05 23:00:00 853.42 854.50 853.76 853.42 305.443990\n", 2213 | "19 2018-03-05 23:15:00 851.51 853.43 853.43 852.45 378.303331\n", 2214 | "20 2018-03-05 23:30:00 851.51 852.68 852.46 852.04 295.210846\n", 2215 | "21 2018-03-05 23:45:00 848.83 852.38 852.05 848.83 1002.927028\n", 2216 | "22 2018-03-06 00:00:00 845.00 848.83 848.83 845.01 1060.817136\n", 2217 | "23 2018-03-06 00:15:00 841.50 845.01 845.01 841.51 1580.089714\n", 2218 | "24 2018-03-06 00:30:00 841.27 842.72 841.51 841.28 864.545325\n", 2219 | "25 2018-03-06 00:45:00 841.20 841.30 841.28 841.21 732.524099\n", 2220 | "26 2018-03-06 01:00:00 839.00 841.21 841.21 839.10 1278.663657\n", 2221 | "27 2018-03-06 01:15:00 838.88 839.50 839.10 838.95 338.720061\n", 2222 | "28 2018-03-06 01:30:00 838.95 841.00 838.95 840.00 674.456015\n", 2223 | "29 2018-03-06 01:45:00 839.99 842.92 840.00 842.75 549.472468\n", 2224 | ".. ... ... ... ... ... ...\n", 2225 | "70 2018-03-06 12:00:00 833.34 834.96 833.34 833.50 326.062875\n", 2226 | "71 2018-03-06 12:15:00 830.00 834.24 833.50 830.01 333.174393\n", 2227 | "72 2018-03-06 12:30:00 828.75 831.00 830.01 829.64 449.343862\n", 2228 | "73 2018-03-06 12:45:00 828.60 830.38 829.65 830.26 371.290560\n", 2229 | "74 2018-03-06 13:00:00 829.00 830.26 830.26 829.00 454.789752\n", 2230 | "75 2018-03-06 13:15:00 828.00 829.75 829.01 828.00 371.369208\n", 2231 | "76 2018-03-06 13:30:00 823.18 828.00 828.00 823.18 731.498006\n", 2232 | "77 2018-03-06 13:45:00 821.00 824.81 823.18 824.46 682.935872\n", 2233 | "78 2018-03-06 14:00:00 822.20 824.50 824.00 823.38 406.937281\n", 2234 | "79 2018-03-06 14:15:00 822.68 825.00 823.38 823.90 1052.106272\n", 2235 | "80 2018-03-06 14:30:00 823.62 829.42 823.87 829.41 776.623191\n", 2236 | "81 2018-03-06 14:45:00 829.00 829.42 829.42 829.40 579.413136\n", 2237 | "82 2018-03-06 15:00:00 829.38 829.42 829.40 829.42 479.022323\n", 2238 | "83 2018-03-06 15:15:00 829.40 830.00 829.42 829.96 618.087375\n", 2239 | "84 2018-03-06 15:30:00 829.96 831.00 829.97 830.51 383.885179\n", 2240 | "85 2018-03-06 15:45:00 830.51 831.15 830.51 831.15 423.077223\n", 2241 | "86 2018-03-06 16:00:00 830.00 831.51 831.14 830.01 753.964558\n", 2242 | "87 2018-03-06 16:15:00 827.00 830.01 830.00 827.14 684.248704\n", 2243 | "88 2018-03-06 16:30:00 826.42 828.57 827.23 828.37 606.958136\n", 2244 | "89 2018-03-06 16:45:00 827.07 828.38 828.38 827.07 345.303085\n", 2245 | "90 2018-03-06 17:00:00 823.50 827.39 827.07 824.61 932.804091\n", 2246 | "91 2018-03-06 17:15:00 820.00 825.13 824.79 820.75 1280.534398\n", 2247 | "92 2018-03-06 17:30:00 816.30 820.22 820.22 819.44 1405.331856\n", 2248 | "93 2018-03-06 17:45:00 816.01 819.44 819.44 816.73 1306.261941\n", 2249 | "94 2018-03-06 18:00:00 816.44 821.99 816.44 821.21 920.348629\n", 2250 | "95 2018-03-06 18:15:00 820.92 822.50 821.21 820.98 407.356682\n", 2251 | "96 2018-03-06 18:30:00 818.00 820.99 820.99 819.00 548.444364\n", 2252 | "97 2018-03-06 18:45:00 811.81 819.00 819.00 811.99 1455.093729\n", 2253 | "98 2018-03-06 19:00:00 804.45 812.00 812.00 807.09 2371.577347\n", 2254 | "99 2018-03-06 19:15:00 803.53 809.99 807.10 804.15 1528.919896\n", 2255 | "\n", 2256 | "[100 rows x 6 columns]" 2257 | ] 2258 | }, 2259 | "metadata": {}, 2260 | "output_type": "display_data" 2261 | } 2262 | ], 2263 | "source": [ 2264 | "start = datetime.datetime.utcnow() - datetime.timedelta(minutes=15)*100\n", 2265 | "end = datetime.datetime.utcnow()\n", 2266 | "\n", 2267 | "df = client.get_historical_data(start,end)\n", 2268 | "display(df)" 2269 | ] 2270 | }, 2271 | { 2272 | "cell_type": "code", 2273 | "execution_count": 6, 2274 | "metadata": {}, 2275 | "outputs": [ 2276 | { 2277 | "data": { 2278 | "text/html": [ 2279 | "
\n", 2280 | "\n", 2293 | "\n", 2294 | " \n", 2295 | " \n", 2296 | " \n", 2297 | " \n", 2298 | " \n", 2299 | " \n", 2300 | " \n", 2301 | " \n", 2302 | " \n", 2303 | " \n", 2304 | " \n", 2305 | " \n", 2306 | " \n", 2307 | " \n", 2308 | " \n", 2309 | " \n", 2310 | " \n", 2311 | " \n", 2312 | " \n", 2313 | " \n", 2314 | " \n", 2315 | " \n", 2316 | " \n", 2317 | " \n", 2318 | " \n", 2319 | " \n", 2320 | " \n", 2321 | " \n", 2322 | " \n", 2323 | " \n", 2324 | " \n", 2325 | " \n", 2326 | " \n", 2327 | " \n", 2328 | " \n", 2329 | " \n", 2330 | " \n", 2331 | " \n", 2332 | " \n", 2333 | " \n", 2334 | " \n", 2335 | " \n", 2336 | " \n", 2337 | " \n", 2338 | " \n", 2339 | " \n", 2340 | " \n", 2341 | " \n", 2342 | " \n", 2343 | " \n", 2344 | " \n", 2345 | " \n", 2346 | " \n", 2347 | " \n", 2348 | " \n", 2349 | " \n", 2350 | " \n", 2351 | " \n", 2352 | " \n", 2353 | " \n", 2354 | " \n", 2355 | " \n", 2356 | " \n", 2357 | " \n", 2358 | " \n", 2359 | " \n", 2360 | " \n", 2361 | " \n", 2362 | " \n", 2363 | " \n", 2364 | " \n", 2365 | " \n", 2366 | " \n", 2367 | " \n", 2368 | " \n", 2369 | " \n", 2370 | " \n", 2371 | " \n", 2372 | " \n", 2373 | " \n", 2374 | " \n", 2375 | " \n", 2376 | " \n", 2377 | " \n", 2378 | " \n", 2379 | " \n", 2380 | " \n", 2381 | " \n", 2382 | " \n", 2383 | " \n", 2384 | " \n", 2385 | " \n", 2386 | " \n", 2387 | " \n", 2388 | " \n", 2389 | " \n", 2390 | " \n", 2391 | " \n", 2392 | " \n", 2393 | " \n", 2394 | " \n", 2395 | " \n", 2396 | " \n", 2397 | " \n", 2398 | " \n", 2399 | " \n", 2400 | " \n", 2401 | " \n", 2402 | " \n", 2403 | " \n", 2404 | " \n", 2405 | " \n", 2406 | " \n", 2407 | " \n", 2408 | " \n", 2409 | " \n", 2410 | " \n", 2411 | " \n", 2412 | " \n", 2413 | " \n", 2414 | " \n", 2415 | " \n", 2416 | " \n", 2417 | " \n", 2418 | " \n", 2419 | " \n", 2420 | " \n", 2421 | " \n", 2422 | " \n", 2423 | " \n", 2424 | " \n", 2425 | " \n", 2426 | " \n", 2427 | " \n", 2428 | " \n", 2429 | " \n", 2430 | " \n", 2431 | " \n", 2432 | " \n", 2433 | " \n", 2434 | " \n", 2435 | " \n", 2436 | " \n", 2437 | " \n", 2438 | " \n", 2439 | " \n", 2440 | " \n", 2441 | " \n", 2442 | " \n", 2443 | " \n", 2444 | " \n", 2445 | " \n", 2446 | " \n", 2447 | " \n", 2448 | " \n", 2449 | " \n", 2450 | " \n", 2451 | " \n", 2452 | " \n", 2453 | " \n", 2454 | " \n", 2455 | " \n", 2456 | " \n", 2457 | " \n", 2458 | " \n", 2459 | " \n", 2460 | " \n", 2461 | " \n", 2462 | " \n", 2463 | " \n", 2464 | " \n", 2465 | " \n", 2466 | " \n", 2467 | " \n", 2468 | " \n", 2469 | " \n", 2470 | " \n", 2471 | " \n", 2472 | " \n", 2473 | " \n", 2474 | " \n", 2475 | " \n", 2476 | " \n", 2477 | " \n", 2478 | " \n", 2479 | " \n", 2480 | " \n", 2481 | " \n", 2482 | " \n", 2483 | " \n", 2484 | " \n", 2485 | " \n", 2486 | " \n", 2487 | " \n", 2488 | " \n", 2489 | " \n", 2490 | " \n", 2491 | " \n", 2492 | " \n", 2493 | " \n", 2494 | " \n", 2495 | " \n", 2496 | " \n", 2497 | " \n", 2498 | " \n", 2499 | " \n", 2500 | " \n", 2501 | " \n", 2502 | " \n", 2503 | " \n", 2504 | " \n", 2505 | " \n", 2506 | " \n", 2507 | " \n", 2508 | " \n", 2509 | " \n", 2510 | " \n", 2511 | " \n", 2512 | " \n", 2513 | " \n", 2514 | " \n", 2515 | " \n", 2516 | " \n", 2517 | " \n", 2518 | " \n", 2519 | " \n", 2520 | " \n", 2521 | " \n", 2522 | " \n", 2523 | " \n", 2524 | " \n", 2525 | " \n", 2526 | " \n", 2527 | " \n", 2528 | " \n", 2529 | " \n", 2530 | " \n", 2531 | " \n", 2532 | " \n", 2533 | " \n", 2534 | " \n", 2535 | " \n", 2536 | " \n", 2537 | " \n", 2538 | " \n", 2539 | " \n", 2540 | " \n", 2541 | " \n", 2542 | " \n", 2543 | " \n", 2544 | " \n", 2545 | " \n", 2546 | " \n", 2547 | " \n", 2548 | " \n", 2549 | " \n", 2550 | " \n", 2551 | " \n", 2552 | " \n", 2553 | " \n", 2554 | " \n", 2555 | " \n", 2556 | " \n", 2557 | " \n", 2558 | " \n", 2559 | " \n", 2560 | " \n", 2561 | " \n", 2562 | " \n", 2563 | " \n", 2564 | " \n", 2565 | " \n", 2566 | " \n", 2567 | " \n", 2568 | " \n", 2569 | " \n", 2570 | " \n", 2571 | " \n", 2572 | " \n", 2573 | " \n", 2574 | " \n", 2575 | " \n", 2576 | " \n", 2577 | " \n", 2578 | " \n", 2579 | " \n", 2580 | " \n", 2581 | " \n", 2582 | " \n", 2583 | " \n", 2584 | " \n", 2585 | " \n", 2586 | " \n", 2587 | " \n", 2588 | " \n", 2589 | " \n", 2590 | " \n", 2591 | " \n", 2592 | " \n", 2593 | " \n", 2594 | " \n", 2595 | " \n", 2596 | " \n", 2597 | " \n", 2598 | " \n", 2599 | " \n", 2600 | " \n", 2601 | " \n", 2602 | " \n", 2603 | " \n", 2604 | " \n", 2605 | " \n", 2606 | " \n", 2607 | " \n", 2608 | " \n", 2609 | " \n", 2610 | " \n", 2611 | " \n", 2612 | " \n", 2613 | " \n", 2614 | " \n", 2615 | " \n", 2616 | " \n", 2617 | " \n", 2618 | " \n", 2619 | " \n", 2620 | " \n", 2621 | " \n", 2622 | " \n", 2623 | " \n", 2624 | " \n", 2625 | " \n", 2626 | " \n", 2627 | " \n", 2628 | " \n", 2629 | " \n", 2630 | " \n", 2631 | " \n", 2632 | " \n", 2633 | " \n", 2634 | " \n", 2635 | " \n", 2636 | " \n", 2637 | " \n", 2638 | " \n", 2639 | " \n", 2640 | " \n", 2641 | " \n", 2642 | " \n", 2643 | " \n", 2644 | " \n", 2645 | " \n", 2646 | " \n", 2647 | " \n", 2648 | " \n", 2649 | " \n", 2650 | " \n", 2651 | " \n", 2652 | " \n", 2653 | " \n", 2654 | " \n", 2655 | " \n", 2656 | " \n", 2657 | " \n", 2658 | " \n", 2659 | " \n", 2660 | " \n", 2661 | " \n", 2662 | " \n", 2663 | " \n", 2664 | " \n", 2665 | " \n", 2666 | " \n", 2667 | " \n", 2668 | " \n", 2669 | " \n", 2670 | " \n", 2671 | " \n", 2672 | " \n", 2673 | " \n", 2674 | " \n", 2675 | " \n", 2676 | " \n", 2677 | " \n", 2678 | " \n", 2679 | " \n", 2680 | " \n", 2681 | " \n", 2682 | " \n", 2683 | " \n", 2684 | " \n", 2685 | " \n", 2686 | " \n", 2687 | " \n", 2688 | " \n", 2689 | " \n", 2690 | " \n", 2691 | " \n", 2692 | " \n", 2693 | " \n", 2694 | " \n", 2695 | " \n", 2696 | " \n", 2697 | " \n", 2698 | " \n", 2699 | " \n", 2700 | " \n", 2701 | " \n", 2702 | " \n", 2703 | " \n", 2704 | " \n", 2705 | " \n", 2706 | " \n", 2707 | " \n", 2708 | " \n", 2709 | " \n", 2710 | " \n", 2711 | " \n", 2712 | " \n", 2713 | " \n", 2714 | " \n", 2715 | " \n", 2716 | " \n", 2717 | " \n", 2718 | " \n", 2719 | " \n", 2720 | " \n", 2721 | " \n", 2722 | " \n", 2723 | " \n", 2724 | " \n", 2725 | " \n", 2726 | " \n", 2727 | " \n", 2728 | " \n", 2729 | " \n", 2730 | " \n", 2731 | " \n", 2732 | " \n", 2733 | " \n", 2734 | " \n", 2735 | " \n", 2736 | " \n", 2737 | " \n", 2738 | " \n", 2739 | " \n", 2740 | " \n", 2741 | " \n", 2742 | " \n", 2743 | " \n", 2744 | " \n", 2745 | " \n", 2746 | " \n", 2747 | " \n", 2748 | " \n", 2749 | " \n", 2750 | " \n", 2751 | " \n", 2752 | " \n", 2753 | " \n", 2754 | " \n", 2755 | " \n", 2756 | " \n", 2757 | " \n", 2758 | " \n", 2759 | " \n", 2760 | " \n", 2761 | " \n", 2762 | " \n", 2763 | " \n", 2764 | " \n", 2765 | " \n", 2766 | " \n", 2767 | " \n", 2768 | " \n", 2769 | " \n", 2770 | " \n", 2771 | " \n", 2772 | " \n", 2773 | " \n", 2774 | " \n", 2775 | " \n", 2776 | " \n", 2777 | " \n", 2778 | " \n", 2779 | " \n", 2780 | " \n", 2781 | " \n", 2782 | " \n", 2783 | " \n", 2784 | " \n", 2785 | " \n", 2786 | " \n", 2787 | " \n", 2788 | " \n", 2789 | " \n", 2790 | " \n", 2791 | " \n", 2792 | " \n", 2793 | " \n", 2794 | " \n", 2795 | " \n", 2796 | " \n", 2797 | " \n", 2798 | " \n", 2799 | " \n", 2800 | " \n", 2801 | " \n", 2802 | " \n", 2803 | " \n", 2804 | " \n", 2805 | " \n", 2806 | " \n", 2807 | " \n", 2808 | " \n", 2809 | " \n", 2810 | " \n", 2811 | " \n", 2812 | " \n", 2813 | " \n", 2814 | " \n", 2815 | " \n", 2816 | " \n", 2817 | " \n", 2818 | " \n", 2819 | " \n", 2820 | " \n", 2821 | " \n", 2822 | " \n", 2823 | " \n", 2824 | " \n", 2825 | " \n", 2826 | " \n", 2827 | " \n", 2828 | " \n", 2829 | " \n", 2830 | " \n", 2831 | " \n", 2832 | " \n", 2833 | " \n", 2834 | " \n", 2835 | " \n", 2836 | " \n", 2837 | " \n", 2838 | " \n", 2839 | " \n", 2840 | " \n", 2841 | " \n", 2842 | " \n", 2843 | " \n", 2844 | " \n", 2845 | " \n", 2846 | " \n", 2847 | " \n", 2848 | " \n", 2849 | " \n", 2850 | " \n", 2851 | " \n", 2852 | " \n", 2853 | " \n", 2854 | " \n", 2855 | " \n", 2856 | "
timelowhighopenclosevolume
02018-03-06 20:47:00654.80655.99654.80655.294.706267
12018-03-06 20:46:00653.98654.80653.98654.8010.108862
22018-03-06 20:45:00653.97653.98653.97653.985.340647
32018-03-06 20:44:00653.98653.98653.98653.980.753588
42018-03-06 20:43:00652.60653.98652.60653.983.023344
52018-03-06 20:42:00652.55652.60652.55652.5918.132344
62018-03-06 20:41:00652.55652.55652.55652.550.173963
72018-03-06 20:40:00651.99652.55651.99652.551.963688
82018-03-06 20:39:00651.90651.91651.90651.914.196280
92018-03-06 20:38:00651.90651.90651.90651.900.450456
102018-03-06 20:37:00651.91651.91651.91651.9110.000000
112018-03-06 20:36:00651.90652.54652.54651.9017.000000
122018-03-06 20:35:00652.54652.54652.54652.541.038912
132018-03-06 20:33:00653.00653.00653.00653.001.000000
142018-03-06 20:32:00654.20654.25654.25654.201.626925
152018-03-06 20:31:00654.26654.26654.26654.260.562000
162018-03-06 20:30:00654.26654.26654.26654.261.923889
172018-03-06 20:29:00654.25654.26654.25654.263.416105
182018-03-06 20:27:00654.30654.30654.30654.300.688071
192018-03-06 20:26:00654.30654.81654.81654.305.804519
202018-03-06 20:25:00654.81654.81654.81654.811.640821
212018-03-06 20:24:00654.80654.81654.81654.801.288618
222018-03-06 20:23:00654.80654.81654.81654.810.510487
232018-03-06 20:22:00654.80654.80654.80654.803.065392
242018-03-06 20:21:00654.80654.86654.85654.861.514186
252018-03-06 20:20:00654.30654.88654.88654.308.756561
262018-03-06 20:19:00654.88654.89654.89654.880.237684
272018-03-06 20:18:00654.30654.95654.95654.892.582167
282018-03-06 20:17:00654.30655.00655.00654.957.433799
292018-03-06 20:16:00655.00656.08656.08656.085.996687
.....................
2122018-03-06 16:29:00672.00672.01672.01672.010.871042
2132018-03-06 16:28:00672.01672.01672.01672.013.075579
2142018-03-06 16:27:00672.01672.01672.01672.010.071214
2152018-03-06 16:24:00672.01672.01672.01672.010.066466
2162018-03-06 16:23:00672.00672.00672.00672.003.687820
2172018-03-06 16:22:00672.00672.00672.00672.000.833204
2182018-03-06 16:20:00672.01672.01672.01672.0136.395920
2192018-03-06 16:19:00672.01672.01672.01672.011.094348
2202018-03-06 16:18:00672.01672.01672.01672.010.128319
2212018-03-06 16:16:00672.01673.00673.00672.017.659028
2222018-03-06 16:15:00673.01673.02673.02673.0144.679372
2232018-03-06 16:14:00673.02673.02673.02673.020.386987
2242018-03-06 16:13:00673.02673.02673.02673.020.478832
2252018-03-06 16:11:00673.01673.01673.01673.010.080000
2262018-03-06 16:10:00673.01673.01673.01673.014.856741
2272018-03-06 16:07:00673.01673.13673.13673.012.916186
2282018-03-06 16:06:00673.02673.56673.56673.273.883835
2292018-03-06 16:05:00672.11673.97673.97672.1125.000000
2302018-03-06 16:03:00673.22674.23673.22673.9814.874706
2312018-03-06 16:02:00672.21673.18672.21673.1815.661113
2322018-03-06 16:00:00672.01672.85672.01672.851.816638
2332018-03-06 15:59:00672.00672.00672.00672.000.060000
2342018-03-06 15:58:00672.00672.01672.01672.000.779630
2352018-03-06 15:57:00672.01672.01672.01672.017.277108
2362018-03-06 15:56:00672.00672.01672.00672.011.337218
2372018-03-06 15:53:00672.01672.01672.01672.011.750674
2382018-03-06 15:52:00672.01672.01672.01672.013.000033
2392018-03-06 15:51:00672.01672.01672.01672.010.109414
2402018-03-06 15:50:00672.00672.01672.00672.013.884583
2412018-03-06 15:49:00672.01672.01672.01672.010.194181
\n", 2857 | "

242 rows × 6 columns

\n", 2858 | "
" 2859 | ], 2860 | "text/plain": [ 2861 | " time low high open close volume\n", 2862 | "0 2018-03-06 20:47:00 654.80 655.99 654.80 655.29 4.706267\n", 2863 | "1 2018-03-06 20:46:00 653.98 654.80 653.98 654.80 10.108862\n", 2864 | "2 2018-03-06 20:45:00 653.97 653.98 653.97 653.98 5.340647\n", 2865 | "3 2018-03-06 20:44:00 653.98 653.98 653.98 653.98 0.753588\n", 2866 | "4 2018-03-06 20:43:00 652.60 653.98 652.60 653.98 3.023344\n", 2867 | "5 2018-03-06 20:42:00 652.55 652.60 652.55 652.59 18.132344\n", 2868 | "6 2018-03-06 20:41:00 652.55 652.55 652.55 652.55 0.173963\n", 2869 | "7 2018-03-06 20:40:00 651.99 652.55 651.99 652.55 1.963688\n", 2870 | "8 2018-03-06 20:39:00 651.90 651.91 651.90 651.91 4.196280\n", 2871 | "9 2018-03-06 20:38:00 651.90 651.90 651.90 651.90 0.450456\n", 2872 | "10 2018-03-06 20:37:00 651.91 651.91 651.91 651.91 10.000000\n", 2873 | "11 2018-03-06 20:36:00 651.90 652.54 652.54 651.90 17.000000\n", 2874 | "12 2018-03-06 20:35:00 652.54 652.54 652.54 652.54 1.038912\n", 2875 | "13 2018-03-06 20:33:00 653.00 653.00 653.00 653.00 1.000000\n", 2876 | "14 2018-03-06 20:32:00 654.20 654.25 654.25 654.20 1.626925\n", 2877 | "15 2018-03-06 20:31:00 654.26 654.26 654.26 654.26 0.562000\n", 2878 | "16 2018-03-06 20:30:00 654.26 654.26 654.26 654.26 1.923889\n", 2879 | "17 2018-03-06 20:29:00 654.25 654.26 654.25 654.26 3.416105\n", 2880 | "18 2018-03-06 20:27:00 654.30 654.30 654.30 654.30 0.688071\n", 2881 | "19 2018-03-06 20:26:00 654.30 654.81 654.81 654.30 5.804519\n", 2882 | "20 2018-03-06 20:25:00 654.81 654.81 654.81 654.81 1.640821\n", 2883 | "21 2018-03-06 20:24:00 654.80 654.81 654.81 654.80 1.288618\n", 2884 | "22 2018-03-06 20:23:00 654.80 654.81 654.81 654.81 0.510487\n", 2885 | "23 2018-03-06 20:22:00 654.80 654.80 654.80 654.80 3.065392\n", 2886 | "24 2018-03-06 20:21:00 654.80 654.86 654.85 654.86 1.514186\n", 2887 | "25 2018-03-06 20:20:00 654.30 654.88 654.88 654.30 8.756561\n", 2888 | "26 2018-03-06 20:19:00 654.88 654.89 654.89 654.88 0.237684\n", 2889 | "27 2018-03-06 20:18:00 654.30 654.95 654.95 654.89 2.582167\n", 2890 | "28 2018-03-06 20:17:00 654.30 655.00 655.00 654.95 7.433799\n", 2891 | "29 2018-03-06 20:16:00 655.00 656.08 656.08 656.08 5.996687\n", 2892 | ".. ... ... ... ... ... ...\n", 2893 | "212 2018-03-06 16:29:00 672.00 672.01 672.01 672.01 0.871042\n", 2894 | "213 2018-03-06 16:28:00 672.01 672.01 672.01 672.01 3.075579\n", 2895 | "214 2018-03-06 16:27:00 672.01 672.01 672.01 672.01 0.071214\n", 2896 | "215 2018-03-06 16:24:00 672.01 672.01 672.01 672.01 0.066466\n", 2897 | "216 2018-03-06 16:23:00 672.00 672.00 672.00 672.00 3.687820\n", 2898 | "217 2018-03-06 16:22:00 672.00 672.00 672.00 672.00 0.833204\n", 2899 | "218 2018-03-06 16:20:00 672.01 672.01 672.01 672.01 36.395920\n", 2900 | "219 2018-03-06 16:19:00 672.01 672.01 672.01 672.01 1.094348\n", 2901 | "220 2018-03-06 16:18:00 672.01 672.01 672.01 672.01 0.128319\n", 2902 | "221 2018-03-06 16:16:00 672.01 673.00 673.00 672.01 7.659028\n", 2903 | "222 2018-03-06 16:15:00 673.01 673.02 673.02 673.01 44.679372\n", 2904 | "223 2018-03-06 16:14:00 673.02 673.02 673.02 673.02 0.386987\n", 2905 | "224 2018-03-06 16:13:00 673.02 673.02 673.02 673.02 0.478832\n", 2906 | "225 2018-03-06 16:11:00 673.01 673.01 673.01 673.01 0.080000\n", 2907 | "226 2018-03-06 16:10:00 673.01 673.01 673.01 673.01 4.856741\n", 2908 | "227 2018-03-06 16:07:00 673.01 673.13 673.13 673.01 2.916186\n", 2909 | "228 2018-03-06 16:06:00 673.02 673.56 673.56 673.27 3.883835\n", 2910 | "229 2018-03-06 16:05:00 672.11 673.97 673.97 672.11 25.000000\n", 2911 | "230 2018-03-06 16:03:00 673.22 674.23 673.22 673.98 14.874706\n", 2912 | "231 2018-03-06 16:02:00 672.21 673.18 672.21 673.18 15.661113\n", 2913 | "232 2018-03-06 16:00:00 672.01 672.85 672.01 672.85 1.816638\n", 2914 | "233 2018-03-06 15:59:00 672.00 672.00 672.00 672.00 0.060000\n", 2915 | "234 2018-03-06 15:58:00 672.00 672.01 672.01 672.00 0.779630\n", 2916 | "235 2018-03-06 15:57:00 672.01 672.01 672.01 672.01 7.277108\n", 2917 | "236 2018-03-06 15:56:00 672.00 672.01 672.00 672.01 1.337218\n", 2918 | "237 2018-03-06 15:53:00 672.01 672.01 672.01 672.01 1.750674\n", 2919 | "238 2018-03-06 15:52:00 672.01 672.01 672.01 672.01 3.000033\n", 2920 | "239 2018-03-06 15:51:00 672.01 672.01 672.01 672.01 0.109414\n", 2921 | "240 2018-03-06 15:50:00 672.00 672.01 672.00 672.01 3.884583\n", 2922 | "241 2018-03-06 15:49:00 672.01 672.01 672.01 672.01 0.194181\n", 2923 | "\n", 2924 | "[242 rows x 6 columns]" 2925 | ] 2926 | }, 2927 | "metadata": {}, 2928 | "output_type": "display_data" 2929 | } 2930 | ], 2931 | "source": [ 2932 | "public_client = gdax.PublicClient()\n", 2933 | "data = public_client.get_product_historic_rates('ETH-EUR', granularity=60)\n", 2934 | "df = pd.DataFrame(data, columns=['time','low','high','open', 'close', 'volume'])\n", 2935 | "df.time = pd.to_datetime(df['time'], unit='s')\n", 2936 | "display(df)" 2937 | ] 2938 | }, 2939 | { 2940 | "cell_type": "code", 2941 | "execution_count": null, 2942 | "metadata": {}, 2943 | "outputs": [], 2944 | "source": [] 2945 | } 2946 | ], 2947 | "metadata": { 2948 | "kernelspec": { 2949 | "display_name": "Python 3", 2950 | "language": "python", 2951 | "name": "python3" 2952 | }, 2953 | "language_info": { 2954 | "codemirror_mode": { 2955 | "name": "ipython", 2956 | "version": 3 2957 | }, 2958 | "file_extension": ".py", 2959 | "mimetype": "text/x-python", 2960 | "name": "python", 2961 | "nbconvert_exporter": "python", 2962 | "pygments_lexer": "ipython3", 2963 | "version": "3.5.2" 2964 | } 2965 | }, 2966 | "nbformat": 4, 2967 | "nbformat_minor": 2 2968 | } 2969 | -------------------------------------------------------------------------------- /trading_env/__init__.py: -------------------------------------------------------------------------------- 1 | from gym.envs.registration import register 2 | 3 | register( 4 | id='trading-v0', 5 | entry_point='trading_env.envs:TradingEnv', 6 | ) 7 | register( 8 | id='test_trading-v0', 9 | entry_point='trading_env.envs:TestTradingEnv', 10 | ) -------------------------------------------------------------------------------- /trading_env/envs/__init__.py: -------------------------------------------------------------------------------- 1 | from trading_env.envs.trading_env import TradingEnv 2 | from trading_env.envs.trading_env import TestTradingEnv -------------------------------------------------------------------------------- /trading_env/envs/trading_env.py: -------------------------------------------------------------------------------- 1 | import gym 2 | from gym import error, spaces, utils 3 | from gym.utils import seeding 4 | 5 | from gdax_client import GdaxClient 6 | 7 | import numpy as np 8 | import pandas as pd 9 | from random import randint 10 | 11 | from os import getcwd 12 | from os.path import join, realpath, dirname, isfile 13 | 14 | import datetime 15 | 16 | class TradingEnv(gym.Env): 17 | 18 | metadata = {'render.modes': ['human']} 19 | 20 | def __init__(self): 21 | self.client = GdaxClient() 22 | self.portfolio_value = 0 23 | self.fiat = 0 24 | self.crypto = 1 25 | self.window_size = 100 26 | self.n_features = 2 27 | self.granularity = 900 28 | # self.episode_steps = 3600/granularity * 24 * 30 #One month episodes 29 | 30 | self.action_space = spaces.Box(low = -1.0, 31 | high = 1.0, 32 | shape = (1,), 33 | dtype = np.float32) 34 | self.observation_space = spaces.Box(low = 0.0, 35 | high = np.finfo(np.float32).max, 36 | shape = (self.window_size, self.n_features,), 37 | dtype = np.float32) 38 | self.last_date = datetime.datetime(1971, 1, 1, 0, 0) 39 | self.portfolio_value = self._get_portfolio_value() 40 | 41 | def seed(self, seed=None): 42 | self.np_random, seed = seeding.np_random(seed) 43 | return [seed] 44 | 45 | def step(self, action): 46 | start = datetime.datetime.utcnow() - datetime.timedelta(minutes=15) * self.window_size 47 | end = datetime.datetime.utcnow() 48 | df = self.client.get_historical_data(start,end) 49 | s = np.transpose(np.array([df["close"],df["volume"]])) 50 | current_value = self._get_portfolio_value() 51 | r = (current_value - self.portfolio_value)/self.portfolio_value 52 | self.portfolio_value = current_value 53 | return s, r 54 | 55 | def reset(self): 56 | pass 57 | 58 | def render(self, mode='human', close=False): 59 | pass 60 | 61 | def _get_portfolio_value(self): 62 | current_price = self.client.get_market_price() 63 | value = self.fiat + self.crypto * current_price 64 | return value 65 | 66 | 67 | class TestTradingEnv(gym.Env): 68 | 69 | metadata = {'render.modes': ['human']} 70 | 71 | def __init__(self): 72 | self.client = GdaxClient() 73 | 74 | self.portfolio_value = 0 75 | self.start_fiat = 0 76 | self.start_crypto = 1 77 | self.fiat = self.start_fiat 78 | self.crypto = self.start_crypto 79 | self.window_size = 100 80 | self.n_features = 2 81 | self.granularity = 900 82 | self.episode_steps = 3600/self.granularity * 24 * 30 #One month episodes 83 | 84 | self.pair = 'ETH-USD' 85 | self.begin = datetime.datetime(2017, 1, 1, 0, 0) # (YYYY/MM/DD/h/min) 86 | self.end = datetime.datetime(2018, 3, 1, 0, 0) 87 | 88 | self.action_space = spaces.Box(low = -1.0, 89 | high = 1.0, 90 | shape = (1,), 91 | dtype = np.float32) 92 | self.observation_space = spaces.Box(low = 0.0, 93 | high = np.finfo(np.float32).max, 94 | shape = (self.window_size, self.n_features,), 95 | dtype = np.float32) 96 | self.start_index = None 97 | self.steps = 0 98 | self._set_data() 99 | self._set_start_index() 100 | self.portfolio_value = self._get_portfolio_value() 101 | 102 | def seed(self, seed=None): 103 | self.np_random, seed = seeding.np_random(seed) 104 | return [seed] 105 | 106 | def step(self, action): 107 | done = False 108 | self._set_portfolio(action) 109 | previous_value = self._get_portfolio_value() 110 | #One timestep goes by... 111 | self.steps += 1 112 | s = self.historical_data.loc[self.start_index + self.steps - self.window_size + 1 : self.start_index + self.steps, 113 | ["close","volume"]].values 114 | s = np.array(s) 115 | 116 | #Normalizing to latest Closing price/Volume 117 | s[:,0] /= s[-1,0] 118 | s[:,1] /= s[-1,1] 119 | current_value = self._get_portfolio_value() 120 | r = ((current_value - previous_value)/self.portfolio_value) * 100 121 | 122 | #if r == 0.0: 123 | # r = -1 124 | 125 | self.portfolio_value = current_value 126 | 127 | if (self.steps >= self.episode_steps): 128 | done = True 129 | 130 | return s, r, done, {} 131 | 132 | def reset(self, date=None): 133 | """ 134 | If date is set to None a random period of one month is chosen for the episode, 135 | otherwise the episode starts at the given date 136 | Returns first state of simulation 137 | """ 138 | if date is None: 139 | self._set_start_index() 140 | else: 141 | tmp_index = next((i for i, x in self.historical_data.iterrows() if not x["time"] < date), None) 142 | if (tmp_index is not None and 143 | (tmp_index + self.episode_steps < self.historical_data.shape[0]) and 144 | (tmp_index >=self.window_size)): 145 | self.start_index = tmp_index 146 | else: 147 | raise ValueError('Incorrect date entered.') 148 | 149 | self.fiat = self.start_fiat 150 | self.crypto = self.start_crypto 151 | self.steps = 0 152 | self.portfolio_value = self._get_portfolio_value() 153 | s = self.historical_data.loc[self.start_index + self.steps - self.window_size + 1 : self.start_index + self.steps, 154 | ["close","volume"]].values 155 | 156 | #Normalizing to latest Closing price/Volume 157 | s[:,0] /= s[-1,0] 158 | s[:,1] /= s[-1,1] 159 | return s 160 | 161 | def render(self, mode='human', close=False): 162 | pass 163 | 164 | def _set_start_index(self): 165 | self.start_index = randint(self.window_size, len(self.historical_data["time"])-self.episode_steps-1) 166 | 167 | def _set_portfolio(self, action): 168 | a = action 169 | current_price = self.historical_data["close"][self.start_index + self.steps] 170 | prev_fiat = self.fiat 171 | prev_crypto = self.crypto 172 | if(a > 0): 173 | self.crypto = a * 1/current_price * prev_fiat + prev_crypto 174 | self.fiat = (1 - a) * prev_fiat 175 | else: 176 | a=-a 177 | self.fiat = a * current_price * prev_crypto + prev_fiat 178 | self.crypto = (1 - a) * prev_crypto 179 | 180 | def _get_portfolio_value(self): 181 | current_price = self.historical_data["close"][self.start_index + self.steps] 182 | value = self.fiat + self.crypto * current_price 183 | return value 184 | 185 | def _set_data(self): 186 | current_dir = realpath(__file__) 187 | main_dir = dirname(dirname(dirname(current_dir))) 188 | data_file = join(main_dir, "data", "train.pkl") 189 | if not isfile(data_file): 190 | print("Downloading historical data") 191 | self.historical_data = self.client.get_historical_data(self.begin, 192 | self.end, 193 | granularity = self.granularity, 194 | pair = self.pair) 195 | self.historical_data.to_pickle(data_file) 196 | else: 197 | print("Loading historical data file") 198 | self.historical_data = pd.read_pickle(data_file) 199 | --------------------------------------------------------------------------------