qis package implements analytics for visualisation of financial data, performance reporting, factsheets and analysis of quantitative strategies.
| 📊 Metric | 🔢 Value |
|---|---|
| PyPI Version | |
| Python Versions | |
| License | |
| CI Status |
| 📊 Metric | 🔢 Value |
|---|---|
| Total Downloads | |
| Monthly | |
| Weekly | |
| GitHub Stars | |
| GitHub Forks |
The package is split into 5 main modules with the dependency path increasing sequentially as follows.
-
qis.utilsis module containing low level utilities for operations with pandas, numpy, and datetimes. -
qis.perfstatsis module for computing performance statistics and performance attribution including returns, volatilities, etc. -
qis.plotsis module for plotting and visualization apis. -
qis.modelsis module containing statistical models including filtering and regressions. -
qis.portfoliois high level module for analysis, simulation, backtesting, and reporting of quant strategies. Functionbacktest_model_portfolio()inqis.portfolio.backtester.pytakes instrument prices and simulated weights from a generic strategy and compute the total return, performance attribution, and risk analysis
qis.examples contains runnable scripts showcasing the analytics, organised by sub-package:
-
qis.examples.perfstats— performance metrics on price series: quickstart usage, Sharpe vs Sortino across return frequencies, rolling performance, bond-ETF risk/return frontier, multi-figure performance reports, miss-best-worst-days impact, infrequent-returns interpolation, and an end-to-end de-levering / unsmoothing walkthrough on a bundled BDC vs private-credit dataset. -
qis.examples.models— numba-vs-pandas EWM kernel benchmarks, multivariate EWM linear factor models, multivariate OLS, EWM correlation tables, OHLC realised-volatility estimators, intraday/overnight return decomposition, rolling correlations, and block bootstrap of price paths. -
qis.examples.regimes— regime-conditional analytics: bull/bear/normal Sharpe attribution, conditional return boxplots by VIX regime, calendar-month seasonality, US election regime study. -
qis.examples.portfolios— backtests usingbacktest_model_portfolio: balanced 60/40 with and without a BTC sleeve, constant-notional short, leveraged-ETF combinations, long/short pairs, and vol-target / trend-following parameter sweeps. -
qis.examples.factsheets— full multi-page factsheets for simulated and actual strategies, cross-sectional asset-class comparisons, multi-strategy parameter sweeps, and optional pybloqs-rendered variants. -
qis.examples.plots— plotting primitives showcase: dual-axis figures, scatter with regression diagnostics. -
qis.examples.utils— date schedules and rolling calendars: option / futures roll generation viagenerate_fixed_maturity_rolls. -
qis.examples.case_studies— cross-cutting domain studies: VIX beta to equities and bonds, VIX term-structure correlation with SPX, conditional returns on the front-month short-VIX strategy, credit-spread regression vs equity / rates.
A README inside qis/examples/ lists every script with a one-line description; examples that need a Bloomberg terminal are flagged inline.
Install using
pip install qisUpgrade using
pip install --upgrade qisClose using
git clone https://github.com/ArturSepp/QuantInvestStrats.gitCore dependencies: python = ">=3.10", numba = ">=0.63.0", numpy = ">=2.0", scipy = ">=1.12.0", statsmodels = ">=0.14.0", pandas = ">=2.2.0", matplotlib = ">=3.8.0", seaborn = ">=0.13.0", openpyxl = ">=3.1.0", PyYAML = ">=6.0", yfinance = ">=0.2.40", pandas-datareader = ">=0.10.0"
Python 3.14 is supported (numba 0.63+ ships cp314 wheels).
Optional dependencies:
pybloqs ">=1.2.13" (for producing html and pdf factsheets — install with pip install qis[reports]),
bbg-fetch ">=2.0.0" (third-party; for examples that pull data from a Bloomberg terminal)
See pyproject.toml for the full list of optional extras (reports, visualization, io, database, jupyter, dev, all).
The script is located in qis.examples.performances (https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/performances.py)
import matplotlib.pyplot as plt
import seaborn as sns
import yfinance as yf
import qis
# define tickers and fetch price data
tickers = ['SPY', 'QQQ', 'EEM', 'TLT', 'IEF', 'SHY', 'LQD', 'HYG', 'GLD']
prices = yf.download(tickers, start="2003-12-31", end=None, ignore_tz=True, auto_adjust=True)['Close'][tickers].dropna()
# plotting price data with minimum usage
with sns.axes_style("darkgrid"):
fig, ax = plt.subplots(1, 1, figsize=(10, 7))
qis.plot_prices(prices=prices, x_date_freq='YE', ax=ax)# 2-axis plot with drawdowns using sns styles
with sns.axes_style("darkgrid"):
fig, axs = plt.subplots(2, 1, figsize=(10, 7), tight_layout=True)
qis.plot_prices_with_dd(prices=prices, x_date_freq='YE', axs=axs)# plot risk-adjusted performance table with excess Sharpe ratio
ust_3m_rate = yf.download('^IRX', start="2003-12-31", end=None, ignore_tz=True, auto_adjust=True)['Close'].dropna() / 100.0
# set parameters for computing performance stats including returns vols and regressions
perf_params = qis.PerfParams(freq='ME', freq_reg='QE', rates_data=ust_3m_rate)
# perf_columns is list to display different perfomance metrics from enumeration PerfStat
fig = qis.plot_ra_perf_table(prices=prices,
perf_columns=[PerfStat.TOTAL_RETURN, PerfStat.PA_RETURN, PerfStat.PA_EXCESS_RETURN,
PerfStat.VOL, PerfStat.SHARPE_RF0,
PerfStat.SHARPE_EXCESS, PerfStat.SORTINO_RATIO, PerfStat.CALMAR_RATIO,
PerfStat.MAX_DD, PerfStat.MAX_DD_VOL,
PerfStat.SKEWNESS, PerfStat.KURTOSIS],
title=f"Risk-adjusted performance: {qis.get_time_period_label(prices, date_separator='-')}",
perf_params=perf_params)# add benchmark regression using excess returns for linear beta
# regression frequency is specified using perf_params.freq_reg
# regression alpha is multiplied using alpha_an_factor
fig, _ = qis.plot_ra_perf_table_benchmark(prices=prices,
benchmark='SPY',
perf_columns=[PerfStat.TOTAL_RETURN, PerfStat.PA_RETURN, PerfStat.PA_EXCESS_RETURN,
PerfStat.VOL, PerfStat.SHARPE_RF0,
PerfStat.SHARPE_EXCESS, PerfStat.SORTINO_RATIO, PerfStat.CALMAR_RATIO,
PerfStat.MAX_DD, PerfStat.MAX_DD_VOL,
PerfStat.SKEWNESS, PerfStat.KURTOSIS,
PerfStat.ALPHA_AN, PerfStat.BETA, PerfStat.R2],
title=f"Risk-adjusted performance: {qis.get_time_period_label(prices, date_separator='-')} benchmarked with SPY",
perf_params=perf_params)This report is adopted for reporting the risk-adjusted performance of several assets with the goal of cross-sectional comparision
Run example in qis.examples.factsheets.multi_assets.py https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/multi_assets.py
This report is adopted for report performance, risk, and trading statistics for either backtested or actual strategy with strategy data passed as PortfolioData object
Run example in qis.examples.factsheets.strategy.py https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/strategy.py
This report is adopted for report performance and marginal comparison of strategy vs a benchmark strategy (data for both are passed using individual PortfolioData object)
Run example in qis.examples.factsheets.strategy_benchmark.py https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/strategy_benchmark.py
Brinson-Fachler performance attribution (https://en.wikipedia.org/wiki/Performance_attribution)
This report is adopted to examine the sensitivity of backtested strategy to a parameter or set of parameters:
Run example in qis.examples.factsheets.multi_strategy.py https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/multi_strategy.py
Recommended package to work with notebooks:
pip install notebookStarting local server
jupyter notebookExamples of using qis analytics jupyter notebooks are located here https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/notebooks
If you are interested in extending and improving QIS analytics, please consider contributing to the library.
I have found it is a good practice to isolate general purpose and low level analytics and visualizations, which can be outsourced and shared, while keeping the focus on developing high level commercial applications.
There are a number of requirements:
-
The code is Pep 8 compliant
-
Reliance on common Python data types including numpy arrays, pandas, and dataclasses.
-
Transparent naming of functions and data types with enough comments. Type annotations of functions and arguments is a must.
-
Each submodule has a unit test for core functions and a localised entry point to core functions.
-
Avoid "super" pythonic constructions. Readability is the priority.
Release history is maintained in CHANGELOG.md.
-
Enhanced documentation and readme examples.
-
Docstrings for key functions.
-
Reporting analytics and factsheets generation enhancing to matplotlib.
QIS package is distributed FREE & WITHOUT ANY WARRANTY under the GNU GENERAL PUBLIC LICENSE.
See the LICENSE.txt in the release for details.
Please report any bugs or suggestions by opening an issue.
.
If you use BloombergFetch in your research, please cite it as:
@software{sepp2024qis,
author={Sepp, Artur},
title={Qua: A Python Package for Bloomberg Terminal Data Access},
year={2024},
url={https://github.com/ArturSepp/BloombergFetch},
version={1.0.27}
}If you use QIS in your research, please cite it as:
@software{sepp2024qis,
title={qis: Implementation of visualisation and reporting analytics for Quantitative Investment Strategies},
author={Sepp, Artur},
year={2024},
url={https://github.com/ArturSepp/QuantInvestStrats}
}