Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
fig.suptitle(title, fontsize=14, y=.995,
fontname=fontname, fontweight='bold', color='black')
fig.set_facecolor('white')
if subtitle:
axes[0].set_title("\n%s - %s ; Sharpe: %.2f " % (
returns.index.date[:1][0].strftime('%e %b \'%y'),
returns.index.date[-1:][0].strftime('%e %b \'%y'),
_stats.sharpe(returns)
), fontsize=12, color='gray')
axes[0].set_ylabel('Cumulative Return', fontname=fontname,
fontweight='bold', fontsize=12)
axes[0].plot(_stats.compsum(returns) * 100, color=colors[1],
lw=1 if grayscale else lw, zorder=1)
axes[0].axhline(0, color='silver', lw=1, zorder=0)
dd = _stats.to_drawdown_series(returns) * 100
ddmin = _utils._round_to_closest(abs(dd.min()), 5)
ddmin_ticks = 5
if ddmin > 50:
ddmin_ticks = ddmin / 4
elif ddmin > 20:
ddmin_ticks = ddmin / 3
ddmin_ticks = int(_utils._round_to_closest(ddmin_ticks, 5))
# ddmin_ticks = int(_utils._round_to_closest(ddmin, 5))
axes[1].set_ylabel('Drawdown', fontname=fontname,
fontweight='bold', fontsize=12)
axes[1].set_yticks(_np.arange(-ddmin, 0, step=ddmin_ticks))
returns.fillna(0, inplace=True)
if isinstance(benchmark, _pd.Series):
benchmark.fillna(0, inplace=True)
if match_volatility and benchmark is None:
raise ValueError('match_volatility requires passing of '
'benchmark.')
if match_volatility and benchmark is not None:
bmark_vol = benchmark.std()
returns = (returns / returns.std()) * bmark_vol
# ---------------
if compound is True:
if cumulative:
returns = _stats.compsum(returns)
if isinstance(benchmark, _pd.Series):
benchmark = _stats.compsum(benchmark)
else:
returns = returns.cumsum()
if isinstance(benchmark, _pd.Series):
benchmark = benchmark.cumsum()
if resample:
returns = returns.resample(resample)
returns = returns.last() if compound is True else returns.sum()
if isinstance(benchmark, _pd.Series):
benchmark = benchmark.resample(resample)
benchmark = benchmark.last(
) if compound is True else benchmark.sum()
# ---------------
if isinstance(benchmark, _pd.Series):
benchmark.fillna(0, inplace=True)
if match_volatility and benchmark is None:
raise ValueError('match_volatility requires passing of '
'benchmark.')
if match_volatility and benchmark is not None:
bmark_vol = benchmark.std()
returns = (returns / returns.std()) * bmark_vol
# ---------------
if compound is True:
if cumulative:
returns = _stats.compsum(returns)
if isinstance(benchmark, _pd.Series):
benchmark = _stats.compsum(benchmark)
else:
returns = returns.cumsum()
if isinstance(benchmark, _pd.Series):
benchmark = benchmark.cumsum()
if resample:
returns = returns.resample(resample)
returns = returns.last() if compound is True else returns.sum()
if isinstance(benchmark, _pd.Series):
benchmark = benchmark.resample(resample)
benchmark = benchmark.last(
) if compound is True else benchmark.sum()
# ---------------
fig, ax = _plt.subplots(figsize=figsize)
ax.spines['top'].set_visible(False)
def to_prices(returns, base=1e5):
""" Converts returns series to price data """
returns = returns.copy().fillna(0).replace(
[_np.inf, -_np.inf], float('NaN'))
return base + base * _stats.compsum(returns)
hlw=1.5, hlcolor="red", hllabel="",
match_volatility=False,
log_scale=False, figsize=(10, 5), ylabel=True,
subtitle=True, compounded=True,
savefig=None, show=True):
title = 'EOY Returns'
if benchmark is not None:
title += ' vs Benchmark'
benchmark = _utils._prepare_benchmark(
benchmark, returns.index).resample('A').apply(
_stats.compsum).resample('A').last()
returns = _utils._prepare_returns(returns).resample('A')
if compounded:
returns = returns.apply(_stats.compsum)
else:
returns = returns.apply(_df.cumsum)
returns = returns.resample('A').last()
_core.plot_returns_bars(returns, benchmark,
fontname=fontname,
hline=returns.mean(),
hlw=hlw,
hllabel=hllabel,
hlcolor=hlcolor,
match_volatility=match_volatility,
log_scale=log_scale,
resample=None,
title=title,
figsize=figsize,
grayscale=grayscale,