mirror of
https://github.com/wassname/rl-portfolio-management.git
synced 2026-08-17 07:00:13 +08:00
157 KiB
157 KiB
In [1]:
# plotting
%matplotlib inline
from matplotlib import pyplot as plt
import seaborn as sns
plt.style.use('ggplot')
# numeric
import numpy as np
from numpy import random
import pandas as pd
# util
from collections import Counter
import pdb
import time
import tempfile
import itertools
from tqdm import tqdm_notebook as tqdm
import datetime
# logging
import logging
logger = log = logging.getLogger(__name__)
# log.setLevel(logging.INFO)
logging.basicConfig()
log.info('%s logger started.', __name__)In [2]:
import gym
from gym import error, spaces, utils
from gym.utils import seedingIn [3]:
import os
os.sys.path.append(os.path.abspath('.'))
%reload_ext autoreload
%autoreload 2In [4]:
# params
window_length = 50
save_path = './outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model'
save_pathOut [4]:
'./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model'
In [5]:
from rl_portfolio_management.environments.portfolio import PortfolioEnvIn [6]:
from rl.memory import SequentialMemory, Memory
from collections import deque
class EnvWrapper(PortfolioEnv):
"""Wraps env to normalise and reshape action."""
def __init__(self, window_length=50, *args, **kwargs):
super().__init__(*args, **kwargs)
def step(self, action):
# also it puts it in a list
if isinstance(action, list):
action = action[0]
# we have to normalise for some reason softmax wont work
if isinstance(action, dict):
action = np.abs(list(action.values()))
action /= action.sum()
return super().step(action) In [7]:
df_train = pd.read_hdf('./data/poloniex_30m.hf',key='train')
env = EnvWrapper(
df=df_train,
steps=30,
scale=True,
augment=0.000,
trading_cost=0, # let just overfit first,
window_length = window_length,
)
env.seed = 0
df_test = pd.read_hdf('./data/poloniex_30m.hf',key='test')
env_test = EnvWrapper(
df=df_test,
steps=30,
scale=True,
augment=0.00,
trading_cost=0, # let just overfit first
window_length=window_length,
)
env_test.seed = 0
from tensorforce.environments.openai_gym import OpenAIGym
environment = OpenAIGym('CartPole-v0')
environment.gym = env
environment_test = OpenAIGym('CartPole-v0')
environment_test.gym = env_testINFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-21 14:29:14,628] Making new env: CartPole-v0 INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-21 14:29:14,638] Making new env: CartPole-v0
In [8]:
# check shapes
obs1, reward, done, info=env.step(np.random.random(env.action_space.shape))
print(reward, done, info)
obs2 = env.reset()
print(obs1.shape,obs2.shape)0.0 False {'reward': 0.0, 'log_return': 0.0, 'portfolio_value': 1.0, 'rate_of_return': 0.0, 'cost': 0.0, 'steps': 2, 'cash_bias': 0.18594253920945863, 'mean_market_returns': 1.0024999885200685}
(5, 50, 3) (5, 50, 3)
In [9]:
from tensorforce import Configuration
from tensorforce.agents import VPGAgent
from tensorforce.core.networks import layered_network_builderIn [10]:
# layer helpers from:
# https://github.com/reinforceio/tensorforce/blob/0d07fadec03f76537a2431e17c51cd759d53b5e9/tensorforce/core/networks/layers.py#L90
import tensorflow as tf
from math import sqrt
from tensorforce import util
from tensorforce import TensorForceError
def linear(x, size, bias=True, l2_regularization=0.0):
if util.rank(x) != 2:
raise TensorForceError('Invalid input rank for linear layer.')
with tf.variable_scope('linear'):
weights = tf.Variable(initial_value=tf.random_normal(shape=(x.get_shape()[1].value, size), stddev=sqrt(2.0 / (x.get_shape()[1].value + size))))
if l2_regularization > 0.0:
tf.losses.add_loss(l2_regularization * tf.nn.l2_loss(t=weights))
x = tf.matmul(a=x, b=weights)
if bias:
bias = tf.Variable(initial_value=tf.zeros(shape=(size,)))
if l2_regularization > 0.0:
tf.losses.add_loss(l2_regularization * tf.nn.l2_loss(t=bias))
x = tf.nn.bias_add(value=x, bias=bias)
return x
def nonlinearity(x, name='relu'):
with tf.variable_scope('nonlinearity'):
if name == 'elu':
x = tf.nn.elu(features=x)
elif name == 'relu':
x = tf.nn.relu(features=x)
elif name == 'selu':
# https://arxiv.org/pdf/1706.02515.pdf
alpha = 1.6732632423543772848170429916717
scale = 1.0507009873554804934193349852946
negative = alpha * tf.nn.elu(features=x)
x = scale * tf.where(condition=(x >= 0.0), x=x, y=negative)
elif name == 'sigmoid':
x = tf.sigmoid(x=x)
elif name == 'softmax':
x = tf.nn.softmax(logits=x)
elif name == 'tanh':
x = tf.nn.tanh(x=x)
else:
raise TensorForceError('Invalid nonlinearity.')
return x
def dense(x, size, bias=True, activation='relu', l2_regularization=0.0):
if util.rank(x) != 2:
raise TensorForceError('Invalid input rank for dense layer.')
with tf.variable_scope('dense'):
x = linear(x=x, size=size, bias=bias, l2_regularization=l2_regularization)
x = nonlinearity(x=x, name=activation)
return x
def flatten(x):
with tf.variable_scope('flatten'):
x = tf.reshape(tensor=x, shape=(-1, util.prod(x.get_shape().as_list()[1:])))
return x
def conv2d(x, size, window=(3,3), stride=(1,1), bias=False, activation='relu', l2_regularization=0.0, padding='SAME'):
if util.rank(x) != 4:
raise TensorForceError('Invalid input rank for conv2d layer.')
with tf.variable_scope('conv2d'):
filters = tf.Variable(initial_value=tf.random_normal(shape=(window[0], window[1], x.get_shape()[3].value, size), stddev=sqrt(2.0 / size)))
if l2_regularization > 0.0:
tf.losses.add_loss(l2_regularization * tf.nn.l2_loss(t=filters))
x = tf.nn.conv2d(input=x, filter=filters, strides=(1, stride[0], stride[1], 1), padding=padding)
if bias:
bias = tf.Variable(initial_value=tf.zeros(shape=(size,)))
if l2_regularization > 0.0:
tf.losses.add_loss(l2_regularization * tf.nn.l2_loss(t=bias))
x = tf.nn.bias_add(value=x, bias=bias)
x = nonlinearity(x=x, name=activation)
return x
In [11]:
# build a network for a given input
def network_builder(inputs):
if len(inputs) != 1:
raise TensorForceError('Layered network must have only one input.')
x = next(iter(inputs.values()))
x = conv2d(x=x, size=2, window=(1,3), bias=True, activation='relu', l2_regularization=1e-8, padding='VALID')
x = conv2d(x=x, size=20, window=(1,window_length-2), bias=True, activation='relu', l2_regularization=1e-8, padding='VALID')
x = conv2d(x=x, size=1, window=(1,1), bias=True, activation='relu', l2_regularization=1e-8, padding='VALID')
x = flatten(x)
x = dense(x, size=env.action_space.shape[0],activation='relu', l2_regularization=1e-8)
x = nonlinearity(x,name='softmax')
return x
network=network_builderIn [12]:
config = Configuration(
# Each model requires the following configuration parameters:
discount=0, # float of discount factor (gamma).
learning_rate=3e-5, # float of learning rate (alpha).
optimizer='adam', # string of optimizer to use (e.g. 'adam').
# optimizer_args= , # list of arguments for optimizer.
# optimizer_kwargs= , # dict of keyword arguments for optimizer.
# device= , # string of tensorflow device name.
tf_saver=True, # boolean whether to save model parameters.
# tf_summary= , # boolean indicating whether to use tensorflow summary file writer.
log_level='info', # string containing logleve (e.g. 'info').
distributed=False , # boolean indicating whether to use distributed tensorflow.
# global_model= , # global model.
# session= , # session to use.
# Each agent requires the following ``Configuration`` parameters:
network=network,
states=dict(shape=tuple(env.observation_space.shape), type='float'),
actions={'action' + str(n): dict(continuous=True) for n in range(env.action_space.shape[0])},
preprocessing = None,# dict or list containing state preprocessing configuration.
exploration = dict(
type='EpsilonDecay',
kwargs=dict(epsilon=1, epsilon_final=0.01, epsilon_timesteps=1e4)
),
# The `BatchAgent` class additionally requires the following parameters:
batch_size = 50,# integer of the batch size.
# A Policy Gradient Model expects the following additional configuration parameters:
sample_actions= True,# boolean of whether to sample actions.
# baseline='mlp' ,# string indicating the baseline value function (currently 'linear' or 'mlp').
# baseline_args=dict(size=100, repeat_update=100) ,# list of arguments for the baseline value function.
override_line_search=False,
# baseline_kwargs= ,# dict of keyword arguments for the baseline value function.
generalized_advantage_estimation= True ,# boolean indicating whether to use GAE.
gae_lambda= 0.97,# float of the Generalized Advantage Estimation lambda.
normalize_advantage= False,# boolean indicating whether to normalize the advantage or not.
)
# Create a Trust Region Policy Optimization agent
agent = VPGAgent(config=config)In [13]:
def sharpe(returns, freq=30, rfr=0):
"""Given a set of returns, calculates naive (rfr=0) sharpe (eq 28) """
return (np.sqrt(freq) * np.mean(returns-rfr)) / np.std(returns - rfr)
def MDD(returns):
"""Max drawdown."""
peak = returns.max()
i = returns.argmax()
trough = returns[returns.argmax():].min()
return (trough-peak)/trough In [14]:
# Callback function printing episode statistics
class EpisodeFinished(object):
"""Logger callback for tensorforce runner"""
def __init__(self, log_intv):
self.log_intv = log_intv
self.portfolio_values = []
self.mdds=[]
self.sharpes=[]
def __call__(self, r):
if len(r.environment.gym.sim.infos):
self.portfolio_values.append(r.environment.gym.sim.infos[-1]['portfolio_value'])
df = pd.DataFrame(r.environment.gym.sim.infos)
self.mdds.append(MDD(df.rate_of_return+1))
self.sharpes.append(sharpe(df.rate_of_return))
if r.episode % self.log_intv == 0:
print(
"Finished episode {ep} after {ts} timesteps (reward: {reward: 2.4f} [{rewards_min: 2.4f}, {rewards_max: 2.4f}]) portfolio_value: {portfolio_value: 2.4f} [{portfolio_value_min: 2.4f}, {portfolio_value_max: 2.4f}] mdd={mdd: 2.2%} sharpe={sharpe: 2.2f}".
format(
ep=r.episode,
ts=r.timestep,
reward=np.mean(r.episode_rewards[-self.log_intv:]),
rewards_min=np.min(r.episode_rewards[-self.log_intv:]),
rewards_max=np.max(r.episode_rewards[-self.log_intv:]),
portfolio_value=np.mean(self.portfolio_values[-self.log_intv:]),
portfolio_value_min=np.min(self.portfolio_values[-self.log_intv:]),
portfolio_value_max=np.max(self.portfolio_values[-self.log_intv:]),
mdd=np.mean(self.mdds[-self.log_intv:]),
sharpe=np.mean(self.sharpes[-self.log_intv:]),
)
)
return TrueIn [15]:
# Callback EpisodeFinishedTQDM
from tqdm import tqdm_notebook
class EpisodeFinishedTQDM(EpisodeFinished):
"""Logger for tensorforce using tqdm_notebook for jupyter-notebook."""
def __init__(self, episodes, log_intv):
"""
log_intv - print the mean metrics every log_intv episodes
"""
super().__init__(log_intv=log_intv)
self.episodes = episodes
self.progbar = tqdm_notebook(desc='',
total=episodes,
leave=True, mininterval=5)
def __call__(self, r):
super().__call__(r)
desc = "reward: {reward: 2.4f} [{rewards_min: 2.4f}, {rewards_max: 2.4f}], portfolio_value: {portfolio_value: 2.4f} [{portfolio_value_min: 2.4f}, {portfolio_value_max: 2.4f}]". format(
reward=np.mean(r.episode_rewards[-1:]),
rewards_min=np.min(r.episode_rewards[-1:]),
rewards_max=np.max(r.episode_rewards[-1:]),
portfolio_value=np.mean(self.portfolio_values[-1:]),
portfolio_value_min=np.min(self.portfolio_values[-1:]),
portfolio_value_max=np.max(self.portfolio_values[-1:])
)
self.progbar.desc = desc
self.progbar.update(1) # update
return TrueIn [16]:
from tensorforce.execution import Runner
runner = Runner(agent=agent, environment=environment, save_path=save_path, save_episodes=10000)In [17]:
agent.load_model(save_path)INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:06:02,111] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
In [18]:
episodes=int(2e6/30)
runner.run(
episodes=episodes, max_timesteps=200, episode_finished=EpisodeFinishedTQDM(log_intv=1000, episodes=episodes))[Data output - unsupported data type map[string]interface {} for mime type application/vnd.jupyter.widget-view+json]
[0;31m---------------------------------------------------------------------------[0m [0;31mKeyboardInterrupt[0m Traceback (most recent call last) [0;32m<ipython-input-18-53b610d06478>[0m in [0;36m<module>[0;34m()[0m [1;32m 1[0m [0mepisodes[0m[0;34m=[0m[0mint[0m[0;34m([0m[0;36m2e6[0m[0;34m/[0m[0;36m30[0m[0;34m)[0m[0;34m[0m[0m [1;32m 2[0m runner.run( [0;32m----> 3[0;31m episodes=episodes, max_timesteps=200, episode_finished=EpisodeFinishedTQDM(log_intv=1000, episodes=episodes)) [0m [0;32m/media/isisilon/Data/linuxOpt/tensorforce/tensorforce/execution/runner.py[0m in [0;36mrun[0;34m(self, episodes, max_timesteps, episode_finished)[0m [1;32m 123[0m [0mself[0m[0;34m.[0m[0mepisode[0m [0;34m=[0m [0;36m1[0m[0;34m[0m[0m [1;32m 124[0m [0;32mwhile[0m [0;32mTrue[0m[0;34m:[0m[0;34m[0m[0m [0;32m--> 125[0;31m [0mstate[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0menvironment[0m[0;34m.[0m[0mreset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 126[0m [0mself[0m[0;34m.[0m[0magent[0m[0;34m.[0m[0mreset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [1;32m 127[0m [0mepisode_reward[0m [0;34m=[0m [0;36m0[0m[0;34m[0m[0m [0;32m/media/isisilon/Data/linuxOpt/tensorforce/tensorforce/environments/openai_gym.py[0m in [0;36mreset[0;34m(self)[0m [1;32m 60[0m [0;34m[0m[0m [1;32m 61[0m [0;32mdef[0m [0mreset[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m---> 62[0;31m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0mgym[0m[0;34m.[0m[0mreset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 63[0m [0;34m[0m[0m [1;32m 64[0m [0;32mdef[0m [0mexecute[0m[0;34m([0m[0mself[0m[0;34m,[0m [0maction[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/gym/core.py[0m in [0;36mreset[0;34m(self)[0m [1;32m 102[0m [0mspace[0m[0;34m.[0m[0;34m[0m[0m [1;32m 103[0m """ [0;32m--> 104[0;31m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0m_reset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 105[0m [0;34m[0m[0m [1;32m 106[0m [0;32mdef[0m [0mrender[0m[0;34m([0m[0mself[0m[0;34m,[0m [0mmode[0m[0;34m=[0m[0;34m'human'[0m[0;34m,[0m [0mclose[0m[0;34m=[0m[0;32mFalse[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m/media/isisilon/Data/My_Documents/Documents/eclipse-workspace/rl_keras_finance/rl-portfolio-management/src/environments/portfolio.py[0m in [0;36m_reset[0;34m(self)[0m [1;32m 250[0m [0;32mdef[0m [0m_reset[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [1;32m 251[0m [0mself[0m[0;34m.[0m[0msim[0m[0;34m.[0m[0mreset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0;32m--> 252[0;31m [0mself[0m[0;34m.[0m[0msrc[0m[0;34m.[0m[0mreset[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 253[0m [0mself[0m[0;34m.[0m[0minfos[0m [0;34m=[0m [0;34m[[0m[0;34m][0m[0;34m[0m[0m [1;32m 254[0m [0maction[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0msim[0m[0;34m.[0m[0mw0[0m[0;34m[0m[0m [0;32m/media/isisilon/Data/My_Documents/Documents/eclipse-workspace/rl_keras_finance/rl-portfolio-management/src/environments/portfolio.py[0m in [0;36mreset[0;34m(self)[0m [1;32m 66[0m [0;34m[0m[0m [1;32m 67[0m [0;31m# augment data to prevent overfitting[0m[0;34m[0m[0;34m[0m[0m [0;32m---> 68[0;31m [0mdata[0m [0;34m=[0m [0mdata[0m[0;34m.[0m[0mapply[0m[0;34m([0m[0;32mlambda[0m [0mx[0m[0;34m:[0m [0mrandom_shift[0m[0;34m([0m[0mx[0m[0;34m,[0m [0mself[0m[0;34m.[0m[0maugment[0m[0;34m)[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 69[0m [0;34m[0m[0m [1;32m 70[0m [0mself[0m[0;34m.[0m[0mdata[0m [0;34m=[0m [0mdata[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36mapply[0;34m(self, func, axis, broadcast, raw, reduce, args, **kwds)[0m [1;32m 4260[0m [0mf[0m[0;34m,[0m [0maxis[0m[0;34m,[0m[0;34m[0m[0m [1;32m 4261[0m [0mreduce[0m[0;34m=[0m[0mreduce[0m[0;34m,[0m[0;34m[0m[0m [0;32m-> 4262[0;31m ignore_failures=ignore_failures) [0m[1;32m 4263[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m [1;32m 4264[0m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0m_apply_broadcast[0m[0;34m([0m[0mf[0m[0;34m,[0m [0maxis[0m[0;34m)[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m_apply_standard[0;34m(self, func, axis, ignore_failures, reduce)[0m [1;32m 4373[0m [0mindex[0m [0;34m=[0m [0;32mNone[0m[0;34m[0m[0m [1;32m 4374[0m [0;34m[0m[0m [0;32m-> 4375[0;31m [0mresult[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0m_constructor[0m[0;34m([0m[0mdata[0m[0;34m=[0m[0mresults[0m[0;34m,[0m [0mindex[0m[0;34m=[0m[0mindex[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 4376[0m [0mresult[0m[0;34m.[0m[0mcolumns[0m [0;34m=[0m [0mres_index[0m[0;34m[0m[0m [1;32m 4377[0m [0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m__init__[0;34m(self, data, index, columns, dtype, copy)[0m [1;32m 273[0m dtype=dtype, copy=copy) [1;32m 274[0m [0;32melif[0m [0misinstance[0m[0;34m([0m[0mdata[0m[0;34m,[0m [0mdict[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m--> 275[0;31m [0mmgr[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0m_init_dict[0m[0;34m([0m[0mdata[0m[0;34m,[0m [0mindex[0m[0;34m,[0m [0mcolumns[0m[0;34m,[0m [0mdtype[0m[0;34m=[0m[0mdtype[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 276[0m [0;32melif[0m [0misinstance[0m[0;34m([0m[0mdata[0m[0;34m,[0m [0mma[0m[0;34m.[0m[0mMaskedArray[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [1;32m 277[0m [0;32mimport[0m [0mnumpy[0m[0;34m.[0m[0mma[0m[0;34m.[0m[0mmrecords[0m [0;32mas[0m [0mmrecords[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m_init_dict[0;34m(self, data, index, columns, dtype)[0m [1;32m 409[0m [0marrays[0m [0;34m=[0m [0;34m[[0m[0mdata[0m[0;34m[[0m[0mk[0m[0;34m][0m [0;32mfor[0m [0mk[0m [0;32min[0m [0mkeys[0m[0;34m][0m[0;34m[0m[0m [1;32m 410[0m [0;34m[0m[0m [0;32m--> 411[0;31m [0;32mreturn[0m [0m_arrays_to_mgr[0m[0;34m([0m[0marrays[0m[0;34m,[0m [0mdata_names[0m[0;34m,[0m [0mindex[0m[0;34m,[0m [0mcolumns[0m[0;34m,[0m [0mdtype[0m[0;34m=[0m[0mdtype[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 412[0m [0;34m[0m[0m [1;32m 413[0m [0;32mdef[0m [0m_init_ndarray[0m[0;34m([0m[0mself[0m[0;34m,[0m [0mvalues[0m[0;34m,[0m [0mindex[0m[0;34m,[0m [0mcolumns[0m[0;34m,[0m [0mdtype[0m[0;34m=[0m[0;32mNone[0m[0;34m,[0m [0mcopy[0m[0;34m=[0m[0;32mFalse[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m_arrays_to_mgr[0;34m(arrays, arr_names, index, columns, dtype)[0m [1;32m 5504[0m [0maxes[0m [0;34m=[0m [0;34m[[0m[0m_ensure_index[0m[0;34m([0m[0mcolumns[0m[0;34m)[0m[0;34m,[0m [0m_ensure_index[0m[0;34m([0m[0mindex[0m[0;34m)[0m[0;34m][0m[0;34m[0m[0m [1;32m 5505[0m [0;34m[0m[0m [0;32m-> 5506[0;31m [0;32mreturn[0m [0mcreate_block_manager_from_arrays[0m[0;34m([0m[0marrays[0m[0;34m,[0m [0marr_names[0m[0;34m,[0m [0maxes[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 5507[0m [0;34m[0m[0m [1;32m 5508[0m [0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/internals.py[0m in [0;36mcreate_block_manager_from_arrays[0;34m(arrays, names, axes)[0m [1;32m 4307[0m [0;34m[0m[0m [1;32m 4308[0m [0;32mtry[0m[0;34m:[0m[0;34m[0m[0m [0;32m-> 4309[0;31m [0mblocks[0m [0;34m=[0m [0mform_blocks[0m[0;34m([0m[0marrays[0m[0;34m,[0m [0mnames[0m[0;34m,[0m [0maxes[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 4310[0m [0mmgr[0m [0;34m=[0m [0mBlockManager[0m[0;34m([0m[0mblocks[0m[0;34m,[0m [0maxes[0m[0;34m)[0m[0;34m[0m[0m [1;32m 4311[0m [0mmgr[0m[0;34m.[0m[0m_consolidate_inplace[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/internals.py[0m in [0;36mform_blocks[0;34m(arrays, names, axes)[0m [1;32m 4371[0m [0mblocks[0m [0;34m=[0m [0;34m[[0m[0;34m][0m[0;34m[0m[0m [1;32m 4372[0m [0;32mif[0m [0mlen[0m[0;34m([0m[0mfloat_items[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m-> 4373[0;31m [0mfloat_blocks[0m [0;34m=[0m [0m_multi_blockify[0m[0;34m([0m[0mfloat_items[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 4374[0m [0mblocks[0m[0;34m.[0m[0mextend[0m[0;34m([0m[0mfloat_blocks[0m[0;34m)[0m[0;34m[0m[0m [1;32m 4375[0m [0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/internals.py[0m in [0;36m_multi_blockify[0;34m(tuples, dtype)[0m [1;32m 4448[0m [0;32mfor[0m [0mdtype[0m[0;34m,[0m [0mtup_block[0m [0;32min[0m [0mgrouper[0m[0;34m:[0m[0;34m[0m[0m [1;32m 4449[0m [0;34m[0m[0m [0;32m-> 4450[0;31m [0mvalues[0m[0;34m,[0m [0mplacement[0m [0;34m=[0m [0m_stack_arrays[0m[0;34m([0m[0mlist[0m[0;34m([0m[0mtup_block[0m[0;34m)[0m[0;34m,[0m [0mdtype[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 4451[0m [0;34m[0m[0m [1;32m 4452[0m [0mblock[0m [0;34m=[0m [0mmake_block[0m[0;34m([0m[0mvalues[0m[0;34m,[0m [0mplacement[0m[0;34m=[0m[0mplacement[0m[0;34m)[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/internals.py[0m in [0;36m_stack_arrays[0;34m(tuples, dtype)[0m [1;32m 4493[0m [0mstacked[0m [0;34m=[0m [0mnp[0m[0;34m.[0m[0mempty[0m[0;34m([0m[0mshape[0m[0;34m,[0m [0mdtype[0m[0;34m=[0m[0mdtype[0m[0;34m)[0m[0;34m[0m[0m [1;32m 4494[0m [0;32mfor[0m [0mi[0m[0;34m,[0m [0marr[0m [0;32min[0m [0menumerate[0m[0;34m([0m[0marrays[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m-> 4495[0;31m [0mstacked[0m[0;34m[[0m[0mi[0m[0;34m][0m [0;34m=[0m [0m_asarray_compat[0m[0;34m([0m[0marr[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 4496[0m [0;34m[0m[0m [1;32m 4497[0m [0;32mreturn[0m [0mstacked[0m[0;34m,[0m [0mplacement[0m[0;34m[0m[0m [0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/internals.py[0m in [0;36m_asarray_compat[0;34m(x)[0m [1;32m 4475[0m [0;31m# fml[0m[0;34m[0m[0;34m[0m[0m [1;32m 4476[0m [0;32mdef[0m [0m_asarray_compat[0m[0;34m([0m[0mx[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;32m-> 4477[0;31m [0;32mif[0m [0misinstance[0m[0;34m([0m[0mx[0m[0;34m,[0m [0mABCSeries[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0m[1;32m 4478[0m [0;32mreturn[0m [0mx[0m[0;34m.[0m[0m_values[0m[0;34m[0m[0m [1;32m 4479[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m [0;31mKeyboardInterrupt[0m:
In [19]:
# save
agent.save_model(save_path)
save_pathOut [19]:
'./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model'
In [ ]:
In [16]:
# one big test
df_test = pd.read_hdf('./data/poloniex_30m.hf',key='test')
steps=2400#len(df_test)-window_length-2
env_test = EnvWrapper(
df=df_test,
steps=steps,
scale=True,
augment=0.00,
trading_cost=0, # let just overfit first
window_length=window_length,
)
env_test.seed = 0
environment_test = OpenAIGym('CartPole-v0')
environment_test.gym = env_test
agent.load_model(save_path)
runner_test = Runner(agent=agent, environment=environment_test)
runner_test.run(
episodes=1, max_timesteps=steps, episode_finished=EpisodeFinished(10))
df = pd.DataFrame(env_test.infos)
df.index=df['index']
s=sharpe(df.rate_of_return+1)
mdd=MDD(df.rate_of_return+1)
apv=df.portfolio_value.iloc[-1]
print('APV (Accumulated portfolio value): \t{: 2.6f}'.format(apv))
print('SR (Sharpe ratio): \t{: 2.6f}'.format( s))
print('MDD (max drawdown): \t{: 2.6%}'.format( mdd))
print('MMR (mean market returns): \t{: 2.6f}'.format(df.mean_market_returns.cumprod().iloc[-1]))
print('')
# show one run vs average market performance
plt.title('test MDD={}, Sharpe={}, APV={}'.format(mdd,s,apv))
df.portfolio_value.plot()
df.mean_market_returns.cumprod().plot(label='mean market performance')
plt.legend()INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-21 14:30:47,675] Making new env: CartPole-v0
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-21 14:30:47,680] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
[0;31m---------------------------------------------------------------------------[0m [0;31mNameError[0m Traceback (most recent call last) [0;32m<ipython-input-16-61c933e5fe09>[0m in [0;36m<module>[0;34m()[0m [1;32m 15[0m [0;34m[0m[0m [1;32m 16[0m [0magent[0m[0;34m.[0m[0mload_model[0m[0;34m([0m[0msave_path[0m[0;34m)[0m[0;34m[0m[0m [0;32m---> 17[0;31m [0mrunner_test[0m [0;34m=[0m [0mRunner[0m[0;34m([0m[0magent[0m[0;34m=[0m[0magent[0m[0;34m,[0m [0menvironment[0m[0;34m=[0m[0menvironment_test[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 18[0m runner_test.run( [1;32m 19[0m episodes=1, max_timesteps=steps, episode_finished=EpisodeFinished(10)) [0;31mNameError[0m: name 'Runner' is not defined
In [ ]:
In [27]:
data=[]
for i in range(10):
agent.load_model(save_path)
df_test = pd.read_hdf('./data/poloniex_30m.hf',key='test')
env_test = EnvWrapper(
df=df_test,
steps=1800,
scale=True,
augment=0.00,
trading_cost=0, # let just overfit first
window_length=window_length,
)
env_test.seed = 0
environment_test = OpenAIGym('CartPole-v0')
environment_test.gym = env_test
runner_test = Runner(agent=agent, environment=environment_test)
np.random.seed(i)
runner_test.run(
episodes=2, max_timesteps=32, episode_finished=EpisodeFinished(10))
df = pd.DataFrame(environment_test.gym.infos)
# df.index=df['index']
s=sharpe(df.rate_of_return+1)
mdd=MDD(df.rate_of_return+1)
data.append(dict(sharpe=s,mdd=mdd))
print('APV (Accumulated portfolio value): \t{: 2.6f}'.format(df.portfolio_value.iloc[-1]))
print('SR (Sharpe ratio): \t{: 2.6f}'.format( s))
print('MDD (max drawdown): \t{: 2.6%}'.format( mdd))
print('MMR (mean market returns): \t{: 2.6f}'.format(df.mean_market_returns.cumprod().iloc[-1]))
print('')
df.portfolio_value.plot(label=str(i))
plt.legend()Out [27]:
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:09,124] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:09,195] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.034579 SR (Sharpe ratio): 322.898386 MDD (max drawdown): -7.676194% MMR (mean market returns): 1.065456 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:09,803] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:09,873] Making new env: CartPole-v0
APV (Accumulated portfolio value): 0.962914 SR (Sharpe ratio): 796.956403 MDD (max drawdown): -2.820202% MMR (mean market returns): 0.979284 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:10,370] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:10,453] Making new env: CartPole-v0
APV (Accumulated portfolio value): 0.960063 SR (Sharpe ratio): 692.779292 MDD (max drawdown): -2.389813% MMR (mean market returns): 0.971125 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:11,027] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:11,106] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.030753 SR (Sharpe ratio): 970.241430 MDD (max drawdown): -1.869627% MMR (mean market returns): 1.050944 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:11,638] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:11,703] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.002456 SR (Sharpe ratio): 863.774706 MDD (max drawdown): -1.959431% MMR (mean market returns): 1.009633 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:12,236] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:12,305] Making new env: CartPole-v0
APV (Accumulated portfolio value): 0.943495 SR (Sharpe ratio): 466.614285 MDD (max drawdown): -5.269238% MMR (mean market returns): 0.968954 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:12,882] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:12,958] Making new env: CartPole-v0
APV (Accumulated portfolio value): 0.905622 SR (Sharpe ratio): 551.573112 MDD (max drawdown): -3.440875% MMR (mean market returns): 0.949998 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:13,478] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:13,557] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.020469 SR (Sharpe ratio): 822.388480 MDD (max drawdown): -3.791417% MMR (mean market returns): 1.016669 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:14,067] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:14,162] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.016870 SR (Sharpe ratio): 637.664818 MDD (max drawdown): -3.573840% MMR (mean market returns): 1.006212 INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:13:14,642] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:13:14,716] Making new env: CartPole-v0
APV (Accumulated portfolio value): 1.061972 SR (Sharpe ratio): 891.327791 MDD (max drawdown): -1.853956% MMR (mean market returns): 1.058966
<matplotlib.legend.Legend at 0x7f0e2cdb2c18>
In [ ]:
dataIn [ ]:
In [22]:
# one big test over train
# one big test
df_train = pd.read_hdf('./data/poloniex_30m.hf',key='train')
steps=len(df_train)-window_length-2
env = EnvWrapper(
df=df_train,
steps=steps,
scale=True,
augment=0.00,
trading_cost=0, # let just overfit first
window_length=window_length,
)
env.seed = 0
environment = OpenAIGym('CartPole-v0')
environment.gym = env
agent.load_model(save_path)
runner = Runner(agent=agent, environment=environment)
runner.run(
episodes=1, max_timesteps=steps, episode_finished=EpisodeFinished(10))
df = pd.DataFrame(env.infos)
df.index=df['index']
s=sharpe(df.rate_of_return+1)
mdd=MDD(df.rate_of_return+1)
data.append(dict(sharpe=s,mdd=mdd))
print('APV (Accumulated portfolio value): \t{: 2.6f}'.format(df.portfolio_value.iloc[-1]))
print('SR (Sharpe ratio): \t{: 2.6f}'.format( s))
print('MDD (max drawdown): \t{: 2.6%}'.format( mdd))
print('')
# show one run vs average market performance
plt.title('train')
df.portfolio_value.plot()
df.mean_market_returns.cumprod().plot(label='mean market performance')
plt.legend()INFO:gym.envs.registration:Making new env: CartPole-v0 [2017-07-19 17:07:07,951] Making new env: CartPole-v0
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
INFO:tensorflow:Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model [2017-07-19 17:07:07,954] Restoring parameters from ./outputs/tensorforce-VPG/tensorforce-VPG_20170717_04-42-55.model
[0;31m---------------------------------------------------------------------------[0m
[0;31mKeyboardInterrupt[0m Traceback (most recent call last)
[0;32m<ipython-input-22-7c12755d4551>[0m in [0;36m<module>[0;34m()[0m
[1;32m 18[0m [0mrunner[0m [0;34m=[0m [0mRunner[0m[0;34m([0m[0magent[0m[0;34m=[0m[0magent[0m[0;34m,[0m [0menvironment[0m[0;34m=[0m[0menvironment[0m[0;34m)[0m[0;34m[0m[0m
[1;32m 19[0m runner.run(
[0;32m---> 20[0;31m episodes=1, max_timesteps=steps, episode_finished=EpisodeFinished(10))
[0m[1;32m 21[0m [0;34m[0m[0m
[1;32m 22[0m [0mdf[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mDataFrame[0m[0;34m([0m[0menv[0m[0;34m.[0m[0minfos[0m[0;34m)[0m[0;34m[0m[0m
[0;32m/media/isisilon/Data/linuxOpt/tensorforce/tensorforce/execution/runner.py[0m in [0;36mrun[0;34m(self, episodes, max_timesteps, episode_finished)[0m
[1;32m 139[0m [0;32mbreak[0m[0;34m[0m[0m
[1;32m 140[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m
[0;32m--> 141[0;31m [0mstate[0m[0;34m,[0m [0mreward[0m[0;34m,[0m [0mterminal[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0menvironment[0m[0;34m.[0m[0mexecute[0m[0;34m([0m[0maction[0m[0;34m=[0m[0maction[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 142[0m [0;34m[0m[0m
[1;32m 143[0m [0mself[0m[0;34m.[0m[0magent[0m[0;34m.[0m[0mobserve[0m[0;34m([0m[0mreward[0m[0;34m=[0m[0mreward[0m[0;34m,[0m [0mterminal[0m[0;34m=[0m[0mterminal[0m[0;34m)[0m[0;34m[0m[0m
[0;32m/media/isisilon/Data/linuxOpt/tensorforce/tensorforce/environments/openai_gym.py[0m in [0;36mexecute[0;34m(self, action)[0m
[1;32m 65[0m [0;32mif[0m [0misinstance[0m[0;34m([0m[0mself[0m[0;34m.[0m[0mgym[0m[0;34m.[0m[0maction_space[0m[0;34m,[0m [0mgym[0m[0;34m.[0m[0mspaces[0m[0;34m.[0m[0mBox[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 66[0m [0maction[0m [0;34m=[0m [0;34m[[0m[0maction[0m[0;34m][0m [0;31m# some gym environments expect a list (f.i. Pendulum-v0)[0m[0;34m[0m[0m
[0;32m---> 67[0;31m [0mstate[0m[0;34m,[0m [0mreward[0m[0;34m,[0m [0mterminal[0m[0;34m,[0m [0m_[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0mgym[0m[0;34m.[0m[0mstep[0m[0;34m([0m[0maction[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 68[0m [0;32mreturn[0m [0mstate[0m[0;34m,[0m [0mreward[0m[0;34m,[0m [0mterminal[0m[0;34m[0m[0m
[1;32m 69[0m [0;34m[0m[0m
[0;32m<ipython-input-6-368e3da9ea5a>[0m in [0;36mstep[0;34m(self, action)[0m
[1;32m 17[0m [0maction[0m [0;34m/=[0m [0maction[0m[0;34m.[0m[0msum[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m
[1;32m 18[0m [0;34m[0m[0m
[0;32m---> 19[0;31m [0;32mreturn[0m [0msuper[0m[0;34m([0m[0;34m)[0m[0;34m.[0m[0mstep[0m[0;34m([0m[0maction[0m[0;34m)[0m[0;34m[0m[0m
[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/gym/core.py[0m in [0;36mstep[0;34m(self, action)[0m
[1;32m 94[0m [0minfo[0m [0;34m([0m[0mdict[0m[0;34m)[0m[0;34m:[0m [0mcontains[0m [0mauxiliary[0m [0mdiagnostic[0m [0minformation[0m [0;34m([0m[0mhelpful[0m [0;32mfor[0m [0mdebugging[0m[0;34m,[0m [0;32mand[0m [0msometimes[0m [0mlearning[0m[0;34m)[0m[0;34m[0m[0m
[1;32m 95[0m """
[0;32m---> 96[0;31m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0m_step[0m[0;34m([0m[0maction[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 97[0m [0;34m[0m[0m
[1;32m 98[0m [0;32mdef[0m [0mreset[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m
[0;32m/media/isisilon/Data/My_Documents/Documents/eclipse-workspace/rl_keras_finance/rl-portfolio-management/src/environments/portfolio.py[0m in [0;36m_step[0;34m(self, action)[0m
[1;32m 226[0m np.sum(weights), 1.0, 3, err_msg='weights should sum to 1. action="%s"' % weights)
[1;32m 227[0m [0;34m[0m[0m
[0;32m--> 228[0;31m [0mobservation[0m[0;34m,[0m [0mdone1[0m [0;34m=[0m [0mself[0m[0;34m.[0m[0msrc[0m[0;34m.[0m[0m_step[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 229[0m [0;34m[0m[0m
[1;32m 230[0m [0my1[0m [0;34m=[0m [0mobservation[0m[0;34m[[0m[0;34m:[0m[0;34m,[0m [0;34m-[0m[0;36m1[0m[0;34m,[0m [0;36m0[0m[0;34m][0m [0;31m# relative price vector (open/close)[0m[0;34m[0m[0m
[0;32m/media/isisilon/Data/My_Documents/Documents/eclipse-workspace/rl_keras_finance/rl-portfolio-management/src/environments/portfolio.py[0m in [0;36m_step[0;34m(self)[0m
[1;32m 47[0m [0;32mif[0m [0mself[0m[0;34m.[0m[0mscale[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 48[0m [0mopen[0m [0;34m=[0m [0mdata_window[0m[0;34m.[0m[0mxs[0m[0;34m([0m[0;34m'open'[0m[0;34m,[0m [0maxis[0m[0;34m=[0m[0;36m1[0m[0;34m,[0m [0mlevel[0m[0;34m=[0m[0;34m'Price'[0m[0;34m)[0m[0;34m[0m[0m
[0;32m---> 49[0;31m [0mdata_window[0m [0;34m=[0m [0mdata_window[0m[0;34m.[0m[0mdivide[0m[0;34m([0m[0mopen[0m[0;34m.[0m[0miloc[0m[0;34m[[0m[0;34m-[0m[0;36m1[0m[0;34m][0m[0;34m,[0m [0mlevel[0m[0;34m=[0m[0;34m'Pair'[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 50[0m [0mdata_window[0m [0;34m=[0m [0mdata_window[0m[0;34m.[0m[0mdrop[0m[0;34m([0m[0;34m'open'[0m[0;34m,[0m [0maxis[0m[0;34m=[0m[0;36m1[0m[0;34m,[0m [0mlevel[0m[0;34m=[0m[0;34m'Price'[0m[0;34m)[0m[0;34m[0m[0m
[1;32m 51[0m [0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/ops.py[0m in [0;36mf[0;34m(self, other, axis, level, fill_value)[0m
[1;32m 1234[0m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0m_combine_frame[0m[0;34m([0m[0mother[0m[0;34m,[0m [0mna_op[0m[0;34m,[0m [0mfill_value[0m[0;34m,[0m [0mlevel[0m[0;34m)[0m[0;34m[0m[0m
[1;32m 1235[0m [0;32melif[0m [0misinstance[0m[0;34m([0m[0mother[0m[0;34m,[0m [0mABCSeries[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m
[0;32m-> 1236[0;31m [0;32mreturn[0m [0mself[0m[0;34m.[0m[0m_combine_series[0m[0;34m([0m[0mother[0m[0;34m,[0m [0mna_op[0m[0;34m,[0m [0mfill_value[0m[0;34m,[0m [0maxis[0m[0;34m,[0m [0mlevel[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 1237[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 1238[0m [0;32mif[0m [0mfill_value[0m [0;32mis[0m [0;32mnot[0m [0;32mNone[0m[0;34m:[0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m_combine_series[0;34m(self, other, func, fill_value, axis, level)[0m
[1;32m 3502[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 3503[0m return self._combine_match_columns(other, func, level=level,
[0;32m-> 3504[0;31m fill_value=fill_value)
[0m[1;32m 3505[0m return self._combine_series_infer(other, func, level=level,
[1;32m 3506[0m fill_value=fill_value)
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36m_combine_match_columns[0;34m(self, other, func, level, fill_value)[0m
[1;32m 3530[0m [0;32mdef[0m [0m_combine_match_columns[0m[0;34m([0m[0mself[0m[0;34m,[0m [0mother[0m[0;34m,[0m [0mfunc[0m[0;34m,[0m [0mlevel[0m[0;34m=[0m[0;32mNone[0m[0;34m,[0m [0mfill_value[0m[0;34m=[0m[0;32mNone[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 3531[0m left, right = self.align(other, join='outer', axis=1, level=level,
[0;32m-> 3532[0;31m copy=False)
[0m[1;32m 3533[0m [0;32mif[0m [0mfill_value[0m [0;32mis[0m [0;32mnot[0m [0;32mNone[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 3534[0m raise NotImplementedError("fill_value %r not supported" %
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/frame.py[0m in [0;36malign[0;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis, broadcast_axis)[0m
[1;32m 2726[0m [0mmethod[0m[0;34m=[0m[0mmethod[0m[0;34m,[0m [0mlimit[0m[0;34m=[0m[0mlimit[0m[0;34m,[0m[0;34m[0m[0m
[1;32m 2727[0m [0mfill_axis[0m[0;34m=[0m[0mfill_axis[0m[0;34m,[0m[0;34m[0m[0m
[0;32m-> 2728[0;31m broadcast_axis=broadcast_axis)
[0m[1;32m 2729[0m [0;34m[0m[0m
[1;32m 2730[0m [0;34m@[0m[0mAppender[0m[0;34m([0m[0m_shared_docs[0m[0;34m[[0m[0;34m'reindex'[0m[0;34m][0m [0;34m%[0m [0m_shared_doc_kwargs[0m[0;34m)[0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/generic.py[0m in [0;36malign[0;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis, broadcast_axis)[0m
[1;32m 4935[0m [0mcopy[0m[0;34m=[0m[0mcopy[0m[0;34m,[0m [0mfill_value[0m[0;34m=[0m[0mfill_value[0m[0;34m,[0m[0;34m[0m[0m
[1;32m 4936[0m [0mmethod[0m[0;34m=[0m[0mmethod[0m[0;34m,[0m [0mlimit[0m[0;34m=[0m[0mlimit[0m[0;34m,[0m[0;34m[0m[0m
[0;32m-> 4937[0;31m fill_axis=fill_axis)
[0m[1;32m 4938[0m [0;32melse[0m[0;34m:[0m [0;31m# pragma: no cover[0m[0;34m[0m[0m
[1;32m 4939[0m [0;32mraise[0m [0mTypeError[0m[0;34m([0m[0;34m'unsupported type: %s'[0m [0;34m%[0m [0mtype[0m[0;34m([0m[0mother[0m[0;34m)[0m[0;34m)[0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/generic.py[0m in [0;36m_align_series[0;34m(self, other, join, axis, level, copy, fill_value, method, limit, fill_axis)[0m
[1;32m 5029[0m join_index, lidx, ridx = self.columns.join(
[1;32m 5030[0m [0mother[0m[0;34m.[0m[0mindex[0m[0;34m,[0m [0mhow[0m[0;34m=[0m[0mjoin[0m[0;34m,[0m [0mlevel[0m[0;34m=[0m[0mlevel[0m[0;34m,[0m[0;34m[0m[0m
[0;32m-> 5031[0;31m return_indexers=True)
[0m[1;32m 5032[0m [0;34m[0m[0m
[1;32m 5033[0m [0;32mif[0m [0mlidx[0m [0;32mis[0m [0;32mnot[0m [0;32mNone[0m[0;34m:[0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/indexes/base.py[0m in [0;36mjoin[0;34m(self, other, how, level, return_indexers, sort)[0m
[1;32m 2999[0m [0;32mif[0m [0mlevel[0m [0;32mis[0m [0;32mnot[0m [0;32mNone[0m [0;32mand[0m [0;34m([0m[0mself_is_mi[0m [0;32mor[0m [0mother_is_mi[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 3000[0m return self._join_level(other, level, how=how,
[0;32m-> 3001[0;31m return_indexers=return_indexers)
[0m[1;32m 3002[0m [0;34m[0m[0m
[1;32m 3003[0m [0mother[0m [0;34m=[0m [0m_ensure_index[0m[0;34m([0m[0mother[0m[0;34m)[0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/indexes/base.py[0m in [0;36m_join_level[0;34m(self, other, level, how, return_indexers, keep_order)[0m
[1;32m 3255[0m right_indexer = algos.take_nd(right_lev_indexer,
[1;32m 3256[0m [0mjoin_index[0m[0;34m.[0m[0mlabels[0m[0;34m[[0m[0mlevel[0m[0;34m][0m[0;34m,[0m[0;34m[0m[0m
[0;32m-> 3257[0;31m allow_fill=False)
[0m[1;32m 3258[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0m
[1;32m 3259[0m [0mright_indexer[0m [0;34m=[0m [0mjoin_index[0m[0;34m.[0m[0mlabels[0m[0;34m[[0m[0mlevel[0m[0;34m][0m[0;34m[0m[0m
[0;32m/home/isisilon/.pyenv/versions/3.6.0/envs/jupyter3/lib/python3.6/site-packages/pandas/core/algorithms.py[0m in [0;36mtake_nd[0;34m(arr, indexer, axis, out, fill_value, mask_info, allow_fill)[0m
[1;32m 1455[0m [0;31m# and the fill_value[0m[0;34m[0m[0;34m[0m[0m
[1;32m 1456[0m [0;32mif[0m [0mout[0m [0;32mis[0m [0;32mNone[0m[0;34m:[0m[0;34m[0m[0m
[0;32m-> 1457[0;31m [0mout_shape[0m [0;34m=[0m [0mlist[0m[0;34m([0m[0marr[0m[0;34m.[0m[0mshape[0m[0;34m)[0m[0;34m[0m[0m
[0m[1;32m 1458[0m [0mout_shape[0m[0;34m[[0m[0maxis[0m[0;34m][0m [0;34m=[0m [0mlen[0m[0;34m([0m[0mindexer[0m[0;34m)[0m[0;34m[0m[0m
[1;32m 1459[0m [0mout_shape[0m [0;34m=[0m [0mtuple[0m[0;34m([0m[0mout_shape[0m[0;34m)[0m[0;34m[0m[0m
[0;31mKeyboardInterrupt[0m: In [ ]: