Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def full(returns, benchmark=None, rf=0., grayscale=False,
figsize=(8, 5), display=True, compounded=True):
dd = _stats.to_drawdown_series(returns)
dd_info = _stats.drawdown_details(dd).sort_values(
by='max drawdown', ascending=True)[:5]
if not dd_info.empty:
dd_info.index = range(1, min(6, len(dd_info)+1))
dd_info.columns = map(lambda x: str(x).title(), dd_info.columns)
if _utils._in_notebook():
iDisplay(iHTML('<h4>Performance Metrics</h4>'))
iDisplay(metrics(returns=returns, benchmark=benchmark,
rf=rf, display=display, mode='full',
compounded=compounded))
iDisplay(iHTML('<h4>5 Worst Drawdowns</h4>'))
if dd_info.empty:
iDisplay(iHTML("<p>(no drawdowns)</p>"))
else:
iDisplay(dd_info)
def _calc_dd(df, display=True):
dd = _stats.to_drawdown_series(df)
dd_info = _stats.drawdown_details(dd)
if dd_info.empty:
return _pd.DataFrame()
if "returns" in dd_info:
ret_dd = dd_info['returns']
else:
ret_dd = dd_info
# pct multiplier
pct = 1 if display else 100
dd_stats = {
'returns': {
'Max Drawdown %': ret_dd.sort_values(
by='max drawdown', ascending=True
else:
# pct multiplier
yoy = _pd.DataFrame(
_utils.group_returns(returns, returns.index.year) * 100)
yoy.columns = ['Return']
yoy['Cumulative'] = _utils.group_returns(
returns, returns.index.year, True)
yoy['Return'] = yoy['Return'].round(2).astype(str) + '%'
yoy['Cumulative'] = (yoy['Cumulative'] *
100).round(2).astype(str) + '%'
yoy.index.name = 'Year'
tpl = tpl.replace('{{eoy_title}}', '<h3>EOY Returns</h3>')
tpl = tpl.replace('{{eoy_table}}', _html_table(yoy))
dd = _stats.to_drawdown_series(returns)
dd_info = _stats.drawdown_details(dd).sort_values(
by='max drawdown', ascending=True)[:10]
dd_info = dd_info[['start', 'end', 'max drawdown', 'days']]
dd_info.columns = ['Started', 'Recovered', 'Drawdown', 'Days']
tpl = tpl.replace('{{dd_info}}', _html_table(dd_info, False))
# plots
figfile = _utils._file_stream()
_plots.returns(returns, benchmark, grayscale=grayscale,
figsize=(8, 5), subtitle=False,
savefig={'fname': figfile, 'format': 'svg'},
show=False, ylabel=False, cumulative=compounded)
tpl = tpl.replace('{{returns}}', figfile.getvalue().decode())
figfile = _utils._file_stream()
_plots.log_returns(returns, benchmark, grayscale=grayscale,
def plot_longest_drawdowns(returns, periods=5, lw=1.5,
fontname='Arial', grayscale=False,
log_scale=False, figsize=(10, 6), ylabel=True,
subtitle=True, compounded=True,
savefig=None, show=True):
colors = ['#348dc1', '#003366', 'red']
if grayscale:
colors = ['#000000'] * 3
dd = _stats.to_drawdown_series(returns.fillna(0))
dddf = _stats.drawdown_details(dd)
longest_dd = dddf.sort_values(
by='days', ascending=False, kind='mergesort')[:periods]
fig, ax = _plt.subplots(figsize=figsize)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
fig.suptitle("Top %.0f Drawdown Periods\n" %
periods, y=.99, fontweight="bold", fontname=fontname,
fontsize=14, color="black")
if subtitle:
ax.set_title("\n%s - %s " % (
returns.index.date[:1][0].strftime('%e %b \'%y'),
returns.index.date[-1:][0].strftime('%e %b \'%y')