Source code for crypto_env.visualizer

import plotly.graph_objects as go
from plotly.subplots import make_subplots
from tqdm import tqdm


[docs]class Visualizer: """A handy collection of result visualization schema. """
[docs] def __init__(self, env, time_feature_name='time'): """__init__ Args: env (:py:class:`CryptoEnv`): The main environment time_feature_name (str, optional): (**deprecated**) Name of the time feature. Defaults to 'time'. """ self._env = env self._time = time_feature_name
[docs] def draw_signal(self): """Plot the buy and sell signal generated by the agent Returns: Plotly figure object """ transaction_record = self._env.recorder.get_transaction_record() buy_signal_index = transaction_record[transaction_record['signal'] == 0].index sell_signal_index = transaction_record[transaction_record['signal'] == 1].index fig = make_subplots() fig.add_trace( go.Scatter( dict(mode='lines', name='Price in USD', x=self._env.dataloader.get_idx(), y=self._env.dataloader.get_feature('PriceUSD'), line_color='black', line_width=1) ) ) fig.add_trace( go.Scatter( dict(name='buy', mode='markers', x=self._env.dataloader.get_idx().iloc[buy_signal_index], y=self._env.dataloader.get_feature('PriceUSD').iloc[buy_signal_index], marker_symbol=119, marker_line_color='green', marker_line_width=2, marker_size=15) ) ) fig.add_trace( go.Scatter( dict(name='sell', mode='markers', x=self._env.dataloader.get_idx().iloc[sell_signal_index], y=self._env.dataloader.get_feature('PriceUSD').iloc[sell_signal_index], marker_symbol=120, marker_line_color='red', marker_line_width=2, marker_size=15) ) ) fig.update_yaxes(title_text="Price in USD") fig.update_xaxes(title_text="Day") fig.update_layout(template="plotly_white") fig.update_layout(title_text='Buy and Sell Signals') return fig
[docs] def draw_portfolio(self): """Plot the portfolio Returns: Plotly figure object """ duration = self._env.dataloader.get_duration() fiat_balance_history = [] crypto_holding_usd_history = [] total_history = [] for i in tqdm(range(duration)): fiat_balance = self._env.recorder.get_fiat_balance(i) fiat_balance_history.append(fiat_balance) for i in tqdm(range(duration)): crypto_holding_usd = self._env.recorder.get_crypto_value(i) crypto_holding_usd_history.append(crypto_holding_usd) for i in tqdm(range(duration)): payload = fiat_balance_history[i] + crypto_holding_usd_history[i] total_history.append(payload) fig = make_subplots() fig.add_trace( go.Scatter( dict(mode='lines', name='Fiat Balance', x=self._env.dataloader.get_idx(), y=fiat_balance_history, line_color='red', line_width=1) ) ) fig.add_trace( go.Scatter( dict(mode='lines', name='Crypto Holding Value (USD)', x=self._env.dataloader.get_idx(), y=crypto_holding_usd_history, line_color='green', line_width=1) ) ) fig.add_trace( go.Scatter( dict(mode='lines', name='Total (USD)', x=self._env.dataloader.get_idx(), y=total_history, line_color='blue', line_width=1) ) ) fig.update_yaxes(title_text="USD") fig.update_xaxes(title_text='Day') fig.update_layout(title_text='Portfolio Time Series') fig.update_layout(template="plotly_white") return fig
[docs] def draw_return(self): """Plot the investment return history Returns: Plotly figure object """ duration = self._env.dataloader.get_duration() roi_history = [] for i in tqdm(range(duration)): roi = self._env.recorder.get_roi(i) roi_history.append(roi) fig = make_subplots(specs=[[{"secondary_y": True}]]) fig.add_trace( go.Scatter( dict( mode='lines', name='Gross ROI', x=self._env.dataloader.get_idx(), y=roi_history, line_color='blue', line_width=1 ) ) ) fig.update_yaxes(title_text="Percent", secondary_y=False) fig.update_yaxes(title_text="Ratio", secondary_y=True) fig.update_xaxes(title_text="Day") fig.update_layout(title_text="Gross ROI and Annualized Sharpe Ratio") fig.update_layout(template="plotly_white") return fig