qis


Nameqis JSON
Version 2.0.58 PyPI version JSON
download
home_pagehttps://github.com/ArturSepp/QuantInvestStrats
SummaryImplementation of visualisation and reporting analytics for Quantitative Investment Strategies
upload_time2024-04-26 15:14:56
maintainerArtur Sepp
docs_urlNone
authorArtur Sepp
requires_python<3.11,>=3.8
licenseLICENSE.txt
keywords quantitative investing portfolio optimization systematic strategies volatility
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
## **Quantitative Investment Strategies: QIS** <a name="analytics"></a>

qis package implements analytics for visualisation of financial data, performance
reporting, analysis of quantitative strategies. 

qis package is split into 5 main modules with the 
dependecy path increasing sequentially as follows.

1. ```qis.utils``` is module containing low level utilities for operations with pandas, numpy, and datetimes.

2. ```qis.perfstats``` is module for computing performance statistics and performance attribution including returns, volatilities, etc.

3. ```qis.plots``` is module for plotting and visualization apis.

4. ```qis.models``` is module containing statistical models including filtering and regressions.

5. ```qis.portfolio``` is high level module for analysis, simulation, backtesting, and reporting of quant strategies.

```qis.examples``` contains scripts with illustrations of QIS analytics.


# Table of contents
1. [Analytics](#analytics)
2. [Installation](#installation)
3. [Examples](#examples)
   1. [Visualization of price data](#price)
   2. [Multi assets factsheet](#multiassets)
   3. [Strategy factsheet](#strategy)
   4. [Strategy benchmark factsheet](#strategybenchmark)
   5. [Multi strategy factsheet](#multistrategy)
   6. [Notebooks](#notebooks)
4. [Contributions](#contributions)
5. [Updates](#updates)
6. [ToDos](#todos)
7. [Disclaimer](#disclaimer)

## **Updates** <a name="updates"></a>

## **Installation** <a name="installation"></a>
Install using
```python 
pip install qis
```
Upgrade using
```python 
pip install --upgrade qis
```

Close using
```python 
git clone https://github.com/ArturSepp/QuantInvestStrats.git
```

Core dependencies:
    python = ">=3.8,<3.11",
    numba = ">=0.56.4",
    numpy = ">=1.22.4",
    scipy = ">=1.10",
    statsmodels = ">=0.13.5",
    pandas = ">=1.5.2",
    matplotlib = ">=3.2.2",
    seaborn = ">=0.12.2"

Optional dependencies:
    yfinance ">=0.1.38" (for getting test price data),
    pybloqs ">=1.2.13" (for producing html and pdf factsheets)


## **Examples** <a name="examples"></a>

### 1. Visualization of price data <a name="price"></a>

The script is located in ```qis.examples.performances``` (https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/performances.py)

```python 
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=None, end=None)['Adj 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)
```
![image info](qis/examples/figures/perf1.PNG)
```python 
# 2-axis plot with drawdowns using sns styles
with sns.axes_style("darkgrid"):
    fig, axs = plt.subplots(2, 1, figsize=(10, 7))
    qis.plot_prices_with_dd(prices=prices, x_date_freq='YE', axs=axs)
```
![image info](qis/examples/figures/perf2.PNG)

```python 
# plot risk-adjusted performance table with excess Sharpe ratio
ust_3m_rate = yf.download('^IRX', start=None, end=None)['Adj Close'].dropna() / 100.0
# set parameters for computing performance stats including returns vols and regressions
perf_params = qis.PerfParams(freq='ME', freq_reg='QE', alpha_an_factor=4.0, 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)
```
![image info](qis/examples/figures/perf3.PNG)



```python 
# add benchmark regression using excess returns for linear beta
# regression frequency is specified using perf_params.freq_reg
# regression alpha is multiplied using perf_params.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)
```
![image info](qis/examples/figures/perf4.PNG)



### 2. Multi assets factsheet <a name="multiassets"></a>
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

![image info](qis/examples/figures/multiassets.PNG)


### 3. Strategy factsheet <a name="strategy"></a>
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

![image info](qis/examples/figures/strategy.PNG)


### 4. Strategy benchmark factsheet <a name="strategybenchmark"></a>
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

![image info](qis/examples/figures/strategy_benchmark.PNG)

Brinson-Fachler performance attribution (https://en.wikipedia.org/wiki/Performance_attribution)
![image info](qis/examples/figures/brinson_attribution.PNG)


### 5. Multi strategy factsheet <a name="multistrategy"></a>
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

![image info](qis/examples/figures/multi_strategy.PNG)


### 6. Notebooks <a name="notebooks"></a>

Recommended package to work with notebooks:  
```python 
pip install notebook
```
Starting local server
```python 
jupyter notebook
```


## **Contributions** <a name="contributions"></a>
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](https://peps.python.org/pep-0008/)

- 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.



## **Updates** <a name="updates"></a>

#### 30 December 2022,  Version 1.0.1 released

#### 08 July 2023, Version 2.0.1 released

Core Changes

1. Portfolio optimization (qis.portfolio.optimisation) layer is removed with core
functionality moved to a stand-alone Python package: Backtesting Optimal Portfolio (bop)
    
* This allows to remove the dependency from cvxpy and sklearn packages and 
thus to simplify the dependency management for qis

2.	Added factsheet reporting using pybloqs package https://github.com/man-group/PyBloqs
* Pybloqs is a versatile tool to create customised reporting using Matplotlib figures and table
and thus leveraging QIS visualisation analytics

3. New factsheets are added
* Examples are added for the four type of reports:
    1. multi assets: report performance of several assets with goal of cross-sectional comparision:
    see qis.examples.factsheets.multi_asset.py
  2. strategy: report performance, risk, and trading statictics for either backtested or actual strategy
    with strategy data passed as PortfolioData object: see qis.examples.factsheets.strategy.py
  3. strategy vs benchmark: report performance and marginal comparison
  of strategy vs a benchmark strategy (data for both are passed using individual PortfolioData object): 
  see qis.examples.factsheets.strategy_benchmark.py
  4. multi_strategy: report for a list of strategies with individual PortfolioData. This report is 
  useful to examine the sensetivity of backtested strategy to a parameter or set of parameters: 
  see qis.examples.factsheets.multi_strategy


## **ToDos** <a name="todos"></a>

1. Enhanced documentation and readme examples.

2. Docstrings for key functions.

3. Reporting analytics and factsheets generation enhancing to matplotlib.



## **Disclaimer** <a name="disclaimer"></a>

QIS package is distributed FREE & WITHOUT ANY WARRANTY under the GNU GENERAL PUBLIC LICENSE.

See the [LICENSE.txt](https://github.com/ArturSepp/QuantInvestStrats/blob/master/LICENSE.txt) in the release for details.

Please report any bugs or suggestions by opening an [issue](https://github.com/ArturSepp/QuantInvestStrats/issues).



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ArturSepp/QuantInvestStrats",
    "name": "qis",
    "maintainer": "Artur Sepp",
    "docs_url": null,
    "requires_python": "<3.11,>=3.8",
    "maintainer_email": "artursepp@gmail.com",
    "keywords": "quantitative, investing, portfolio optimization, systematic strategies, volatility",
    "author": "Artur Sepp",
    "author_email": "artursepp@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/d4/02/c0f545c979d8240b01d6083db80a06623ba84ae2d886ae1e7b19be60d649/qis-2.0.58.tar.gz",
    "platform": null,
    "description": "\n## **Quantitative Investment Strategies: QIS** <a name=\"analytics\"></a>\n\nqis package implements analytics for visualisation of financial data, performance\nreporting, analysis of quantitative strategies. \n\nqis package is split into 5 main modules with the \ndependecy path increasing sequentially as follows.\n\n1. ```qis.utils``` is module containing low level utilities for operations with pandas, numpy, and datetimes.\n\n2. ```qis.perfstats``` is module for computing performance statistics and performance attribution including returns, volatilities, etc.\n\n3. ```qis.plots``` is module for plotting and visualization apis.\n\n4. ```qis.models``` is module containing statistical models including filtering and regressions.\n\n5. ```qis.portfolio``` is high level module for analysis, simulation, backtesting, and reporting of quant strategies.\n\n```qis.examples``` contains scripts with illustrations of QIS analytics.\n\n\n# Table of contents\n1. [Analytics](#analytics)\n2. [Installation](#installation)\n3. [Examples](#examples)\n   1. [Visualization of price data](#price)\n   2. [Multi assets factsheet](#multiassets)\n   3. [Strategy factsheet](#strategy)\n   4. [Strategy benchmark factsheet](#strategybenchmark)\n   5. [Multi strategy factsheet](#multistrategy)\n   6. [Notebooks](#notebooks)\n4. [Contributions](#contributions)\n5. [Updates](#updates)\n6. [ToDos](#todos)\n7. [Disclaimer](#disclaimer)\n\n## **Updates** <a name=\"updates\"></a>\n\n## **Installation** <a name=\"installation\"></a>\nInstall using\n```python \npip install qis\n```\nUpgrade using\n```python \npip install --upgrade qis\n```\n\nClose using\n```python \ngit clone https://github.com/ArturSepp/QuantInvestStrats.git\n```\n\nCore dependencies:\n    python = \">=3.8,<3.11\",\n    numba = \">=0.56.4\",\n    numpy = \">=1.22.4\",\n    scipy = \">=1.10\",\n    statsmodels = \">=0.13.5\",\n    pandas = \">=1.5.2\",\n    matplotlib = \">=3.2.2\",\n    seaborn = \">=0.12.2\"\n\nOptional dependencies:\n    yfinance \">=0.1.38\" (for getting test price data),\n    pybloqs \">=1.2.13\" (for producing html and pdf factsheets)\n\n\n## **Examples** <a name=\"examples\"></a>\n\n### 1. Visualization of price data <a name=\"price\"></a>\n\nThe script is located in ```qis.examples.performances``` (https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/performances.py)\n\n```python \nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport yfinance as yf\nimport qis\n\n# define tickers and fetch price data\ntickers = ['SPY', 'QQQ', 'EEM', 'TLT', 'IEF', 'SHY', 'LQD', 'HYG', 'GLD']\nprices = yf.download(tickers, start=None, end=None)['Adj Close'][tickers].dropna()\n\n# plotting price data with minimum usage\nwith sns.axes_style(\"darkgrid\"):\n    fig, ax = plt.subplots(1, 1, figsize=(10, 7))\n    qis.plot_prices(prices=prices, x_date_freq='YE', ax=ax)\n```\n![image info](qis/examples/figures/perf1.PNG)\n```python \n# 2-axis plot with drawdowns using sns styles\nwith sns.axes_style(\"darkgrid\"):\n    fig, axs = plt.subplots(2, 1, figsize=(10, 7))\n    qis.plot_prices_with_dd(prices=prices, x_date_freq='YE', axs=axs)\n```\n![image info](qis/examples/figures/perf2.PNG)\n\n```python \n# plot risk-adjusted performance table with excess Sharpe ratio\nust_3m_rate = yf.download('^IRX', start=None, end=None)['Adj Close'].dropna() / 100.0\n# set parameters for computing performance stats including returns vols and regressions\nperf_params = qis.PerfParams(freq='ME', freq_reg='QE', alpha_an_factor=4.0, rates_data=ust_3m_rate)\n# perf_columns is list to display different perfomance metrics from enumeration PerfStat\nfig = qis.plot_ra_perf_table(prices=prices,\n                             perf_columns=[PerfStat.TOTAL_RETURN, PerfStat.PA_RETURN, PerfStat.PA_EXCESS_RETURN,\n                                           PerfStat.VOL, PerfStat.SHARPE_RF0,\n                                           PerfStat.SHARPE_EXCESS, PerfStat.SORTINO_RATIO, PerfStat.CALMAR_RATIO,\n                                           PerfStat.MAX_DD, PerfStat.MAX_DD_VOL,\n                                           PerfStat.SKEWNESS, PerfStat.KURTOSIS],\n                             title=f\"Risk-adjusted performance: {qis.get_time_period_label(prices, date_separator='-')}\",\n                             perf_params=perf_params)\n```\n![image info](qis/examples/figures/perf3.PNG)\n\n\n\n```python \n# add benchmark regression using excess returns for linear beta\n# regression frequency is specified using perf_params.freq_reg\n# regression alpha is multiplied using perf_params.alpha_an_factor\nfig = qis.plot_ra_perf_table_benchmark(prices=prices,\n                                       benchmark='SPY',\n                                       perf_columns=[PerfStat.TOTAL_RETURN, PerfStat.PA_RETURN, PerfStat.PA_EXCESS_RETURN,\n                                                     PerfStat.VOL, PerfStat.SHARPE_RF0,\n                                                     PerfStat.SHARPE_EXCESS, PerfStat.SORTINO_RATIO, PerfStat.CALMAR_RATIO,\n                                                     PerfStat.MAX_DD, PerfStat.MAX_DD_VOL,\n                                                     PerfStat.SKEWNESS, PerfStat.KURTOSIS,\n                                                     PerfStat.ALPHA_AN, PerfStat.BETA, PerfStat.R2],\n                                       title=f\"Risk-adjusted performance: {qis.get_time_period_label(prices, date_separator='-')} benchmarked with SPY\",\n                                       perf_params=perf_params)\n```\n![image info](qis/examples/figures/perf4.PNG)\n\n\n\n### 2. Multi assets factsheet <a name=\"multiassets\"></a>\nThis report is adopted for reporting the risk-adjusted performance \nof several assets with the goal\nof cross-sectional comparision\n\nRun example in ```qis.examples.factsheets.multi_assets.py``` https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/multi_assets.py\n\n![image info](qis/examples/figures/multiassets.PNG)\n\n\n### 3. Strategy factsheet <a name=\"strategy\"></a>\nThis report is adopted for report performance, risk, and trading statistics\nfor either backtested or actual strategy\n    with strategy data passed as PortfolioData object\n\nRun example in ```qis.examples.factsheets.strategy.py``` https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/strategy.py\n\n![image info](qis/examples/figures/strategy.PNG)\n\n\n### 4. Strategy benchmark factsheet <a name=\"strategybenchmark\"></a>\nThis report is adopted for report performance and marginal comparison\n  of strategy vs a benchmark strategy \n(data for both are passed using individual PortfolioData object)\n\nRun example in ```qis.examples.factsheets.strategy_benchmark.py``` https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/strategy_benchmark.py\n\n![image info](qis/examples/figures/strategy_benchmark.PNG)\n\nBrinson-Fachler performance attribution (https://en.wikipedia.org/wiki/Performance_attribution)\n![image info](qis/examples/figures/brinson_attribution.PNG)\n\n\n### 5. Multi strategy factsheet <a name=\"multistrategy\"></a>\nThis report is adopted to examine the sensitivity of \nbacktested strategy to a parameter or set of parameters:\n\nRun example in ```qis.examples.factsheets.multi_strategy.py``` https://github.com/ArturSepp/QuantInvestStrats/blob/master/qis/examples/factsheets/multi_strategy.py\n\n![image info](qis/examples/figures/multi_strategy.PNG)\n\n\n### 6. Notebooks <a name=\"notebooks\"></a>\n\nRecommended package to work with notebooks:  \n```python \npip install notebook\n```\nStarting local server\n```python \njupyter notebook\n```\n\n\n## **Contributions** <a name=\"contributions\"></a>\nIf you are interested in extending and improving QIS analytics, \nplease consider contributing to the library.\n\nI 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 \nthe focus on developing high level commercial applications.\n\nThere are a number of requirements:\n\n- The code is [Pep 8 compliant](https://peps.python.org/pep-0008/)\n\n- Reliance on common Python data types including numpy arrays, pandas, and dataclasses.\n\n- Transparent naming of functions and data types with enough comments. Type annotations of functions and arguments is a must.\n\n- Each submodule has a unit test for core functions and a localised entry point to core functions.\n\n- Avoid \"super\" pythonic constructions. Readability is the priority.\n\n\n\n## **Updates** <a name=\"updates\"></a>\n\n#### 30 December 2022,  Version 1.0.1 released\n\n#### 08 July 2023, Version 2.0.1 released\n\nCore Changes\n\n1. Portfolio optimization (qis.portfolio.optimisation) layer is removed with core\nfunctionality moved to a stand-alone Python package: Backtesting Optimal Portfolio (bop)\n    \n* This allows to remove the dependency from cvxpy and sklearn packages and \nthus to simplify the dependency management for qis\n\n2.\tAdded factsheet reporting using pybloqs package https://github.com/man-group/PyBloqs\n* Pybloqs is a versatile tool to create customised reporting using Matplotlib figures and table\nand thus leveraging QIS visualisation analytics\n\n3. New factsheets are added\n* Examples are added for the four type of reports:\n    1. multi assets: report performance of several assets with goal of cross-sectional comparision:\n    see qis.examples.factsheets.multi_asset.py\n  2. strategy: report performance, risk, and trading statictics for either backtested or actual strategy\n    with strategy data passed as PortfolioData object: see qis.examples.factsheets.strategy.py\n  3. strategy vs benchmark: report performance and marginal comparison\n  of strategy vs a benchmark strategy (data for both are passed using individual PortfolioData object): \n  see qis.examples.factsheets.strategy_benchmark.py\n  4. multi_strategy: report for a list of strategies with individual PortfolioData. This report is \n  useful to examine the sensetivity of backtested strategy to a parameter or set of parameters: \n  see qis.examples.factsheets.multi_strategy\n\n\n## **ToDos** <a name=\"todos\"></a>\n\n1. Enhanced documentation and readme examples.\n\n2. Docstrings for key functions.\n\n3. Reporting analytics and factsheets generation enhancing to matplotlib.\n\n\n\n## **Disclaimer** <a name=\"disclaimer\"></a>\n\nQIS package is distributed FREE & WITHOUT ANY WARRANTY under the GNU GENERAL PUBLIC LICENSE.\n\nSee the [LICENSE.txt](https://github.com/ArturSepp/QuantInvestStrats/blob/master/LICENSE.txt) in the release for details.\n\nPlease report any bugs or suggestions by opening an [issue](https://github.com/ArturSepp/QuantInvestStrats/issues).\n\n\n",
    "bugtrack_url": null,
    "license": "LICENSE.txt",
    "summary": "Implementation of visualisation and reporting analytics for Quantitative Investment Strategies",
    "version": "2.0.58",
    "project_urls": {
        "Documentation": "https://github.com/ArturSepp/QuantInvestStrats",
        "Homepage": "https://github.com/ArturSepp/QuantInvestStrats",
        "Issues": "https://github.com/ArturSepp/QuantInvestStrats/issues",
        "Personal website": "https://artursepp.com",
        "Repository": "https://github.com/ArturSepp/QuantInvestStrats"
    },
    "split_keywords": [
        "quantitative",
        " investing",
        " portfolio optimization",
        " systematic strategies",
        " volatility"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d402c0f545c979d8240b01d6083db80a06623ba84ae2d886ae1e7b19be60d649",
                "md5": "19c32f4bda6772032d8af184c0dda77b",
                "sha256": "6bc9647f21b2911a9f4e95b092d44766a750987938e06f1b83f7617b9d5a7542"
            },
            "downloads": -1,
            "filename": "qis-2.0.58.tar.gz",
            "has_sig": false,
            "md5_digest": "19c32f4bda6772032d8af184c0dda77b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.11,>=3.8",
            "size": 10306665,
            "upload_time": "2024-04-26T15:14:56",
            "upload_time_iso_8601": "2024-04-26T15:14:56.755675Z",
            "url": "https://files.pythonhosted.org/packages/d4/02/c0f545c979d8240b01d6083db80a06623ba84ae2d886ae1e7b19be60d649/qis-2.0.58.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-26 15:14:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ArturSepp",
    "github_project": "QuantInvestStrats",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "qis"
}
        
Elapsed time: 0.33683s