Skip to content

Commit 5b591e6

Browse files
authored
implementa rolling_sharpe (#17)
* implementa rolling_sharpe * remove comentários de célula p/ ipython
1 parent 4dfd0e9 commit 5b591e6

File tree

1 file changed

+47
-3
lines changed

1 file changed

+47
-3
lines changed

turingquant/metrics.py

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ def alpha(end_price, dps, start_price):
4848
return(end_price + dps - start_price) / start_price
4949

5050

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

105104

106-
# %%
105+
def rolling_sharpe(returns, window, risk_free=0, plot=True):
106+
"""
107+
Plota o beta móvel para um ativo e um benchmark de referência, na forma de séries de retornos.
108+
109+
Parâmetros:
110+
returns (array): série de retornos para o qual o Sharpe Ratio será calculado.
111+
window (int): janela móvel para calcular o Sharpe ao longo do tempo.
112+
risk_free (float): valor da taxa livre de risco para cálculo do Sharpe.
113+
plot (bool): se `True`, plota um gráfico de linha com o Sharpe ao longo do tempo.
114+
115+
Retorna:
116+
rolling_beta (pd.Series): uma série com os valores do Beta para os últimos `window` dias.
117+
A série não possui os `window` primeiros dias.
118+
119+
"""
120+
rolling_sharpe = pd.Series([sharpe_ratio(returns[i - window:i], risk_free)
121+
for i in range(window, len(returns))], returns[window:].index)
122+
if plot:
123+
fig = px.line(rolling_sharpe, title="Sharpe móvel")
124+
overall_sharpe = sharpe_ratio(returns, risk_free)
125+
fig.update_layout(shapes=[
126+
dict(
127+
type='line',
128+
xref='paper', x0=0, x1=1,
129+
yref='y', y0=overall_sharpe, y1=overall_sharpe,
130+
line=dict(
131+
color='grey',
132+
width=2,
133+
dash='dash'
134+
)
135+
)
136+
], annotations=[
137+
dict(
138+
text='sharpe total: %.3f' % overall_sharpe,
139+
xref='paper', x=0.05,
140+
yref='y', y=overall_sharpe,
141+
xanchor='left'
142+
)
143+
])
144+
fig.update_layout(showlegend=False)
145+
fig.update_xaxes(title_text='Tempo')
146+
fig.update_yaxes(title_text='Sharpe móvel: ' + str(window) + ' períodos')
147+
fig.show()
148+
return rolling_sharpe
149+
150+
107151
def test_metrics():
108152
"""
109153
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,

0 commit comments

Comments
 (0)