Performance Attribution

The module empyrical.perf_attrib facilitates the attribution of performance to various risk factors.

empyrical.perf_attrib.compute_exposures(positions, factor_loadings)

Compute daily risk factor exposures.

Parameters
positions: pd.Series

A series of holdings as percentages indexed by date and ticker. - Examples:

dt ticker 2017-01-01 AAPL 0.417582

TLT 0.010989 XOM 0.571429

2017-01-02 AAPL 0.202381

TLT 0.535714 XOM 0.261905

factor_loadingspd.DataFrame

Factor loadings for all days in the date range, with date and ticker as index, and factors as columns. - Example:

momentum reversal

dt ticker 2017-01-01 AAPL -1.592914 0.852830

TLT 0.184864 0.895534 XOM 0.993160 1.149353

2017-01-02 AAPL -0.140009 -0.524952

TLT -1.066978 0.185435 XOM -1.798401 0.761549

Returns
risk_exposures_portfoliopd.DataFrame

df indexed by datetime, with factors as columns - Example:

momentum reversal

dt 2017-01-01 -0.238655 0.077123 2017-01-02 0.821872 1.520515

empyrical.perf_attrib.perf_attrib(returns, positions, factor_returns, factor_loadings)

Attributes the performance of a returns stream to a set of risk factors.

Performance attribution determines how much each risk factor, e.g., momentum, the technology sector, etc., contributed to total returns, as well as the daily exposure to each of the risk factors. The returns that can be attributed to one of the given risk factors are the common_returns, and the returns that _cannot_ be attributed to a risk factor are the specific_returns. The common_returns and specific_returns summed together will always equal the total returns.

Parameters
returnspd.Series

Returns for each day in the date range. - Example:

2017-01-01 -0.017098 2017-01-02 0.002683 2017-01-03 -0.008669

positions: pd.Series

Daily holdings in percentages, indexed by date. - Examples:

dt ticker 2017-01-01 AAPL 0.417582

TLT 0.010989 XOM 0.571429

2017-01-02 AAPL 0.202381

TLT 0.535714 XOM 0.261905

factor_returnspd.DataFrame

Returns by factor, with date as index and factors as columns - Example:

momentum reversal

2017-01-01 0.002779 -0.005453 2017-01-02 0.001096 0.010290

factor_loadingspd.DataFrame

Factor loadings for all days in the date range, with date and ticker as index, and factors as columns. - Example:

momentum reversal

dt ticker 2017-01-01 AAPL -1.592914 0.852830

TLT 0.184864 0.895534 XOM 0.993160 1.149353

2017-01-02 AAPL -0.140009 -0.524952

TLT -1.066978 0.185435 XOM -1.798401 0.761549

Returns
tuple of (risk_exposures_portfolio, perf_attribution)
risk_exposures_portfoliopd.DataFrame

df indexed by datetime, with factors as columns - Example:

momentum reversal

dt 2017-01-01 -0.238655 0.077123 2017-01-02 0.821872 1.520515

perf_attributionpd.DataFrame

df with factors, common returns, and specific returns as columns, and datetimes as index - Example:

momentum reversal common_returns specific_returns

dt 2017-01-01 0.249087 0.935925 1.185012 1.185012 2017-01-02 -0.003194 -0.400786 -0.403980 -0.403980