Skip to content

Commit

Permalink
implementa rolling_sharpe (#17)
Browse files Browse the repository at this point in the history
* implementa rolling_sharpe

* remove comentários de célula p/ ipython
  • Loading branch information
anor4k authored Sep 14, 2020
1 parent 4dfd0e9 commit 5b591e6
Showing 1 changed file with 47 additions and 3 deletions.
50 changes: 47 additions & 3 deletions turingquant/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ def alpha(end_price, dps, start_price):
return(end_price + dps - start_price) / start_price


# %%
def rolling_beta(returns, benchmark, window, plot=True):
"""
Plota o beta móvel para um ativo e um benchmark de referência, na forma de séries de retornos.
Expand All @@ -71,7 +70,7 @@ def rolling_beta(returns, benchmark, window, plot=True):
# que itera entre (window, len) e calcula o beta pros últimos `window` dias
merged['rolling_beta'] = np.append(np.full(window, np.nan),
[beta(merged.iloc[i - window:i, 0], merged.iloc[i - window:i, 1])
for i in range(window, len(merged))]
for i in range(window, len(merged))]
)
merged = merged[window:]
if plot:
Expand Down Expand Up @@ -103,7 +102,52 @@ def rolling_beta(returns, benchmark, window, plot=True):
return merged['rolling_beta']


# %%
def rolling_sharpe(returns, window, risk_free=0, plot=True):
"""
Plota o beta móvel para um ativo e um benchmark de referência, na forma de séries de retornos.
Parâmetros:
returns (array): série de retornos para o qual o Sharpe Ratio será calculado.
window (int): janela móvel para calcular o Sharpe ao longo do tempo.
risk_free (float): valor da taxa livre de risco para cálculo do Sharpe.
plot (bool): se `True`, plota um gráfico de linha com o Sharpe ao longo do tempo.
Retorna:
rolling_beta (pd.Series): uma série com os valores do Beta para os últimos `window` dias.
A série não possui os `window` primeiros dias.
"""
rolling_sharpe = pd.Series([sharpe_ratio(returns[i - window:i], risk_free)
for i in range(window, len(returns))], returns[window:].index)
if plot:
fig = px.line(rolling_sharpe, title="Sharpe móvel")
overall_sharpe = sharpe_ratio(returns, risk_free)
fig.update_layout(shapes=[
dict(
type='line',
xref='paper', x0=0, x1=1,
yref='y', y0=overall_sharpe, y1=overall_sharpe,
line=dict(
color='grey',
width=2,
dash='dash'
)
)
], annotations=[
dict(
text='sharpe total: %.3f' % overall_sharpe,
xref='paper', x=0.05,
yref='y', y=overall_sharpe,
xanchor='left'
)
])
fig.update_layout(showlegend=False)
fig.update_xaxes(title_text='Tempo')
fig.update_yaxes(title_text='Sharpe móvel: ' + str(window) + ' períodos')
fig.show()
return rolling_sharpe


def test_metrics():
"""
Essa função define uma série aleatória de 50 elementos de retornos de um ativo fictício e de um índice de mercado e, a partir deles,
Expand Down

0 comments on commit 5b591e6

Please sign in to comment.