Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stefan-jansen/empyrical-reloaded
Common financial risk and performance metrics. Used by zipline and pyfolio.
https://github.com/stefan-jansen/empyrical-reloaded
Last synced: 2 days ago
JSON representation
Common financial risk and performance metrics. Used by zipline and pyfolio.
- Host: GitHub
- URL: https://github.com/stefan-jansen/empyrical-reloaded
- Owner: stefan-jansen
- License: apache-2.0
- Fork: true (quantopian/empyrical)
- Created: 2021-02-23T19:12:16.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-09-25T00:03:02.000Z (about 2 months ago)
- Last Synced: 2024-11-03T02:07:04.185Z (15 days ago)
- Language: Python
- Homepage: https://empyrical.ml4trading.io/
- Size: 2.68 MB
- Stars: 50
- Watchers: 5
- Forks: 24
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-quant - empyrical-reloaded - Common financial risk and performance metrics. [empyrical](https://github.com/quantopian/empyrical) fork. (Python / Risk Analysis)
- pytrade.org - empyrical-reloaded - Common financial risk and performance metrics. Used by zipline and pyfolio. (Curated List / Analytics)
README
![PyPI](https://img.shields.io/pypi/v/empyrical-reloaded)
![PyPI - Downloads](https://img.shields.io/pypi/dm/empyrical-reloaded)[![Conda Version](https://img.shields.io/conda/vn/conda-forge/empyrical-reloaded.svg)](https://anaconda.org/conda-forge/empyrical-reloaded)
[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/empyrical-reloaded.svg)](https://anaconda.org/conda-forge/empyrical-reloaded)[![PyPI Wheels](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/build_wheels.yml/badge.svg)](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/build_wheels.yml)
[![Conda packages](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/conda_package.yml/badge.svg)](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/conda_package.yml)
[![CI Tests](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/unit_tests.yml/badge.svg)](https://github.com/stefan-jansen/empyrical-reloaded/actions/workflows/unit_tests.yml)Common financial return and risk metrics in Python.
## Installation
empyrical requires Python 3.9+. You can install it using `pip`:
```bash
pip install empyrical-reloaded
```or `conda` from the `conda-forge` channel
```bash
conda install empyrical-reloaded -c conda-forge
```empyrical requires and installs the following packages while executing the above commands:
- numpy>=1.23.5
- pandas>=1.3.0
- scipy>=0.15.1> Note that Numpy>=2.0 requires pandas>=2.2.2. If you are using an older version of pandas, you may need to upgrade
> accordingly, otherwise you may encounter compatibility issues.Optional dependencies include [yfinance](https://github.com/ranaroussi/yfinance) to download price data
from [Yahoo! Finance](https://finance.yahoo.com/)
and [pandas-datareader](https://pandas-datareader.readthedocs.io/en/latest/) to
access [Fama-French](https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html) risk factors and FRED
treasury yields.> Note that `pandas-datareader` is not compatible with Python>=3.12.
To install the optional dependencies, use:
```bash
pip install empyrical-reloaded[yfinance]
```or
```bash
pip install empyrical-reloaded[datreader]
```or
```bash
pip install empyrical-reloaded[yfinance,datreader]
```## Usage
### Simple Statistics
Empyrical computes basic metrics from returns and volatility to alpha and beta, Value at Risk, and Shorpe or Sortino
ratios.```python
import numpy as np
from empyrical import max_drawdown, alpha_betareturns = np.array([.01, .02, .03, -.4, -.06, -.02])
benchmark_returns = np.array([.02, .02, .03, -.35, -.05, -.01])# calculate the max drawdown
max_drawdown(returns)# calculate alpha and beta
alpha, beta = alpha_beta(returns, benchmark_returns)
```### Rolling Measures
Empyrical also aggregates return and risk metrics for rolling windows:
```python
import numpy as np
from empyrical import roll_max_drawdownreturns = np.array([.01, .02, .03, -.4, -.06, -.02])
# calculate the rolling max drawdown
roll_max_drawdown(returns, window=3)
```### Pandas Support
Empyrical also works with both [NumPy](https://numpy.org/) arrays and [Pandas](https://pandas.pydata.org/) data
structures:```python
import pandas as pd
from empyrical import roll_up_capture, capturereturns = pd.Series([.01, .02, .03, -.4, -.06, -.02])
factor_returns = pd.Series([.02, .01, .03, -.01, -.02, .02])# calculate a capture ratio
capture(returns, factor_returns)
-0.147387712263491```
### Fama-French Risk Factors
Empyrical downloads Fama-French risk factors from 1970 onward:
> Note: requires optional dependency `pandas-datareader` - see installation instructions above.gst
```python
import pandas as pd
import empyrical as emprisk_factors = emp.utils.get_fama_french()
pd.concat([risk_factors.head(), risk_factors.tail()])
Mkt - RF
SMB
HML
RF
Mom
Date
1970 - 01 - 02
00: 00:00 + 00: 00
0.0118
0.0129
0.0101
0.00029 - 0.0340
1970 - 01 - 05
00: 00:00 + 00: 00
0.0059
0.0067
0.0072
0.00029 - 0.0153
1970 - 01 - 06
00: 00:00 + 00: 00 - 0.0074
0.0010
0.0021
0.00029
0.0038
1970 - 01 - 07
00: 00:00 + 00: 00 - 0.0015
0.0040 - 0.0033
0.00029
0.0011
1970 - 01 - 0
8
00: 00:00 + 00: 00
0.0004
0.0018 - 0.0017
0.00029
0.0033
2024 - 03 - 22
00: 00:00 + 00: 00 - 0.0023 - 0.0087 - 0.0053
0.00021
0.0043
2024 - 03 - 25
00: 00:00 + 00: 00 - 0.0026 - 0.0024
0.0088
0.00021 - 0.0034
2024 - 03 - 26
00: 00:00 + 00: 00 - 0.0026
0.0009 - 0.0013
0.00021
0.0009
2024 - 03 - 27
00: 00:00 + 00: 00
0.0088
0.0104
0.0091
0.00021 - 0.0134
2024 - 03 - 28
00: 00:00 + 00: 00
0.0010
0.0029
0.0048
0.00021 - 0.0044
```### Asset Prices and Benchmark Returns
Empyrical use [yfinance](https://github.com/ranaroussi/yfinance) to download price data
from [Yahoo! Finance](https://finance.yahoo.com/). To obtain the S&P returns since 1950, use:> Note: requires optional dependency `yfinance` - see installation instructions above.
```python
import empyrical as empsymbol = '^GSPC'
returns = emp.utils.get_symbol_returns_from_yahoo(symbol,
start='1950-01-01')import seaborn as sns # requires separate installation
import matplotlib.pyplot as plt # requires separate installationfig, axes = plt.subplots(ncols=2, figsize=(14, 5))
with sns.axes_style('whitegrid'):
returns.plot(ax=axes[0], rot=0, title='Time Series', legend=False)
sns.histplot(returns, ax=axes[1], legend=False)
axes[1].set_title('Histogram')
sns.despine()
plt.tight_layout()
plt.suptitle('Daily S&P 500 Returns')
```### Documentation
See the [documentation](https://empyrical.ml4trading.io) for details on the API.
## Support
Please [open an issue](https://github.com/stefan-jansen/empyrical-reloaded/issues/new) for support.
## Contributing
Please contribute using [Github Flow](https://guides.github.com/introduction/flow/). Create a branch, add commits,
and [open a pull request](https://github.com/stefan-jansen/empyrical-reloaded/compare/).## Testing
- install requirements
- "pytest>=6.2.0",```bash
pytest tests
```