QuantStats Python library that performs portfolio profiling, allowing quants and portfolio managers to understand their performance better by providing them with in-depth analytics and risk metrics.
- quantstats.stats- for calculating various performance metrics, like Sharpe ratio, Win rate, Volatility, etc.
- quantstats.plots- for visualizing performance, drawdowns, rolling statistics, monthly returns, etc.
- quantstats.reports- for generating metrics reports, batch plotting, and creating tear sheets that can be saved as an HTML file.
Here's an example of a simple tear sheet analyzing a strategy:
%matplotlib inline
import quantstats as qs
# extend pandas functionality with metrics, etc.
qs.extend_pandas()
# fetch the daily returns for a stock
stock = qs.utils.download_returns('FB')
# show sharpe ratio
qs.stats.sharpe(stock)
# or using extend_pandas() :)
stock.sharpe()Output:
0.8135304438803402
qs.plots.snapshot(stock, title='Facebook Performance')
# can also be called via:
# stock.plot_snapshot(title='Facebook Performance')Output:
You can create 7 different report tearsheets:
- qs.reports.metrics(mode='basic|full", ...)- shows basic/full metrics
- qs.reports.plots(mode='basic|full", ...)- shows basic/full plots
- qs.reports.basic(...)- shows basic metrics and plots
- qs.reports.full(...)- shows full metrics and plots
- qs.reports.html(...)- generates a complete report as html
Let' create an html tearsheet
(benchmark can be a pandas Series or ticker)
qs.reports.html(stock, "SPY")Output will generate something like this:
[f for f in dir(qs.stats) if f[0] != '_']['avg_loss',
 'avg_return',
 'avg_win',
 'best',
 'cagr',
 'calmar',
 'common_sense_ratio',
 'comp',
 'compare',
 'compsum',
 'conditional_value_at_risk',
 'consecutive_losses',
 'consecutive_wins',
 'cpc_index',
 'cvar',
 'drawdown_details',
 'expected_return',
 'expected_shortfall',
 'exposure',
 'gain_to_pain_ratio',
 'geometric_mean',
 'ghpr',
 'greeks',
 'implied_volatility',
 'information_ratio',
 'kelly_criterion',
 'kurtosis',
 'max_drawdown',
 'monthly_returns',
 'outlier_loss_ratio',
 'outlier_win_ratio',
 'outliers',
 'payoff_ratio',
 'profit_factor',
 'profit_ratio',
 'r2',
 'r_squared',
 'rar',
 'recovery_factor',
 'remove_outliers',
 'risk_of_ruin',
 'risk_return_ratio',
 'rolling_greeks',
 'ror',
 'sharpe',
 'skew',
 'sortino',
 'adjusted_sortino',
 'tail_ratio',
 'to_drawdown_series',
 'ulcer_index',
 'ulcer_performance_index',
 'upi',
 'utils',
 'value_at_risk',
 'var',
 'volatility',
 'win_loss_ratio',
 'win_rate',
 'worst']
[f for f in dir(qs.plots) if f[0] != '_']['daily_returns',
 'distribution',
 'drawdown',
 'drawdowns_periods',
 'earnings',
 'histogram',
 'log_returns',
 'monthly_heatmap',
 'returns',
 'rolling_beta',
 'rolling_sharpe',
 'rolling_sortino',
 'rolling_volatility',
 'snapshot',
 'yearly_returns']
*** Full documenttion coming soon ***
In the meantime, you can get insights as to optional parameters for each method, by using Python's help method:
help(qs.stats.conditional_value_at_risk)Help on function conditional_value_at_risk in module quantstats.stats:
conditional_value_at_risk(returns, sigma=1, confidence=0.99)
    calculats the conditional daily value-at-risk (aka expected shortfall)
    quantifies the amount of tail risk an investment
Install using pip:
$ pip install quantstats --upgrade --no-cache-dirInstall using conda:
$ conda install -c ranaroussi quantstats- Python >= 3.5+
- pandas (tested to work with >=0.24.0)
- numpy >= 1.15.0
- scipy >= 1.2.0
- matplotlib >= 3.0.0
- seaborn >= 0.9.0
- tabulate >= 0.8.0
- yfinance >= 0.1.38
- plotly >= 3.4.1 (optional, for using plots.to_plotly())
This is a new library... If you find a bug, please open an issue in this repository.
If you'd like to contribute, a great place to look is the issues marked with help-wanted.
For some reason, I couldn't find a way to tell seaborn not to return the
monthly returns heatmap when instructed to save - so even if you save the plot (by passing savefig={...}) it will still show the plot.
QuantStats is distributed under the Apache Software License. See the LICENSE.txt file in the release for details.
Please drop me a note with any feedback you have.
Ran Aroussi

