Sharpe Ratio Performance Metric with Python

Last Update: December 21, 2020

Portfolio performance metrics consist of portfolio expected or realized risk premium by unit of risk.

This topic is part of Advanced Portfolio Analysis with Python course. Feel free to take a look at Course Curriculum.

This tutorial has an educational and informational purpose and doesn’t constitute any type of trading or investment advice. All content, including code and data, is presented for personal educational use exclusively and with no guarantee of exactness of completeness. Past performance doesn’t guarantee future results. Please read full Disclaimer.

An example of portfolio performance metrics is Sharpe ratio [1] which consists of portfolio expected or realized risk premium by unit of risk.

1. Formula notation.

1.1. Ex-ante or expected Sharpe ratio formula notation.

E(s(r_{p}))=\frac{E(r_{p}-r_{f})}{E(\sigma(r_{p}-r_{f}))}

Where E(s(r_{p})) = ex-ante or expected portfolio returns Sharpe ratio, E(r_{p}-r_{f}) = ex-ante or expected portfolio returns risk premium, E(\sigma(r_{p}-r_{f})) = ex-ante or expected portfolio returns risk premium standard deviation, r_{f} \; or \; r_{b} = risk free or benchmark returns can be used.

1.2. Ex-post or realized Sharpe ratio formula notation.

s(r_{p})=\frac{\bar{r}_{p}-\bar{r}_{f}}{\sigma(r_{p}-r_{f})}

Where s(r_{p}) = ex-post or realized portfolio returns Sharpe ratio, \bar{r}_{p}-\bar{r}_{f} = ex-post or realized portfolio returns risk premium, \bar{r}_{p} = ex-post or realized portfolio returns mean, \bar{r}_{f} = ex-post or realized risk free returns mean, \sigma(r_{p}-r_{f}) = ex-post or realized portfolio returns risk premium standard deviation, r_{f} \; or \; r_{b} = risk free or benchmark returns can be used.

1.3. Ex-post or realized Sharpe ratio risk free or benchmark returns through time period assumptions formulas notation.

if\;r_{f,t=1\rightarrow n}\neq c\rightarrow s(r_{p})=\frac{\bar{r}_{p}-\bar{r}_{f}}{\sigma(r_{p}-r_{f})}

if\;r_{f,t=1\rightarrow n} = c\rightarrow s(r_{p})=\frac{\bar{r}_{p}-r_{f}}{\sigma(r_{p})}

if\;r_{f,t=1\rightarrow n} = 0\rightarrow s(r_{p})=\frac{\bar{r}_{p}}{\sigma(r_{p})}

Where r_{f,t=1\rightarrow n} = ex-post or realized risk free return through time period, n = number of observations in time period, c = constant, s(r_{p}) = ex-post or realized portfolio returns Sharpe ratio, \bar{r}_{p}-\bar{r}_{f} = ex-post or realized portfolio returns risk premium, \bar{r}_{p} = ex-post or realized portfolio returns mean, \bar{r}_{f} = ex-post or realized risk free returns mean, \sigma(r_{p}-r_{f}) = ex-post or realized portfolio returns risk premium standard deviation, r_{f} = ex-post or realized risk free return, \sigma(r_{p}) = ex-post or realized portfolio returns standard deviation, r_{f} \; or \; r_{b} = risk free or benchmark returns can be used.

2. Python code example.

2.1. Import Python packages [2].

import numpy as np
import pandas as pd

2.2. Sharpe ratio performance metric data reading.

  • Data: S&P 500® index replicating ETF (ticker symbol: SPY) adjusted close prices monthly arithmetic returns (2007-2016).
returns = pd.read_csv('Data//Sharpe-Ratio-Performance-Metric-Data.txt', index_col='Date', parse_dates=True)

2.3. Sharpe ratio performance metric calculation and output.

  • Note: ex-post or realized Sharpe ratio calculation and risk-free return assumption not fixed and only included for educational purposes.
In:
print('== Sharpe Ratio Performance Metric (SPY) ==')
print('')
print('Monthly Sharpe Ratio (Rf=0%):', np.round(returns['SPY'].mean()/returns['SPY'].std(), 6))
Out:
== Sharpe Ratio Performance Metric (SPY) ==

Monthly Sharpe Ratio (Rf=0%): 0.145594
3. References.

[1] William F. Sharpe. “The Sharpe Ratio”. Journal of Portfolio Management. 1994.

[2] Travis E, Oliphant. “A guide to NumPy”. USA: Trelgol Publishing. 2006.

Stéfan van der Walt, S. Chris Colbert and Gaël Varoquaux. “The NumPy Array: A Structure for Efficient Numerical Computation”. Computing in Science & Engineering. 2011.

Wes McKinney. “Data Structures for Statistical Computing in Python.” Proceedings of the 9th Python in Science Conference. 2010.