@@ -48,7 +48,6 @@ def alpha(end_price, dps, start_price):
4848 return (end_price + dps - start_price ) / start_price
4949
5050
51- # %%
5251def 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+
107151def 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