From 99ebd87cba6a0efba2804f9030fec415b8d91fe3 Mon Sep 17 00:00:00 2001 From: Young Date: Tue, 22 Sep 2020 01:43:21 +0000 Subject: [PATCH] init commit --- .gitignore | 33 + CHANGES.rst | 152 ++ README.md | 196 +++ docs/Makefile | 20 + .../img/analysis/analysis_model_IC.png | Bin 0 -> 37797 bytes .../img/analysis/analysis_model_NDQ.png | Bin 0 -> 24455 bytes .../analysis_model_auto_correlation.png | Bin 0 -> 48805 bytes .../analysis_model_cumulative_return.png | Bin 0 -> 65813 bytes .../analysis/analysis_model_long_short.png | Bin 0 -> 16726 bytes .../analysis/analysis_model_monthly_IC.png | Bin 0 -> 17842 bytes .../analysis_model_top_bottom_turnover.png | Bin 0 -> 60752 bytes .../img/analysis/cumulative_return_buy.png | Bin 0 -> 41758 bytes .../cumulative_return_buy_minus_sell.png | Bin 0 -> 45308 bytes .../img/analysis/cumulative_return_hold.png | Bin 0 -> 42700 bytes .../img/analysis/cumulative_return_sell.png | Bin 0 -> 53555 bytes docs/_static/img/analysis/rank_label_buy.png | Bin 0 -> 93661 bytes docs/_static/img/analysis/rank_label_hold.png | Bin 0 -> 72184 bytes docs/_static/img/analysis/rank_label_sell.png | Bin 0 -> 102033 bytes docs/_static/img/analysis/report.png | Bin 0 -> 151446 bytes .../img/analysis/risk_analysis_annual.png | Bin 0 -> 51666 bytes .../img/analysis/risk_analysis_bar.png | Bin 0 -> 12087 bytes .../img/analysis/risk_analysis_mdd.png | Bin 0 -> 55467 bytes .../img/analysis/risk_analysis_sharpe.png | Bin 0 -> 54703 bytes .../img/analysis/risk_analysis_std.png | Bin 0 -> 52178 bytes docs/_static/img/analysis/score_ic.png | Bin 0 -> 101417 bytes docs/_static/img/framework.png | Bin 0 -> 209724 bytes docs/_static/img/topk_drop.png | Bin 0 -> 51648 bytes docs/advanced/alpha.rst | 104 ++ docs/changelog/changelog.rst | 2 + docs/component/backtest.rst | 106 ++ docs/component/data.rst | 333 ++++ docs/component/estimator.rst | 674 ++++++++ docs/component/model.rst | 179 +++ docs/component/report.rst | 197 +++ docs/component/strategy.rst | 119 ++ docs/conf.py | 224 +++ docs/hidden/client.rst | 171 ++ docs/hidden/online.rst | 285 ++++ docs/hidden/tuner.rst | 327 ++++ docs/index.rst | 60 + docs/introduction/introduction.rst | 45 + docs/reference/api.rst | 117 ++ docs/requirements.txt | 1 + docs/start/getdata.rst | 137 ++ docs/start/initialization.rst | 60 + docs/start/installation.rst | 43 + docs/start/integration.rst | 146 ++ .../estimator/analyze_from_estimator.ipynb | 257 +++ examples/estimator/estimator_config.yaml | 55 + examples/estimator/estimator_config_dnn.yaml | 57 + examples/train_and_backtest.py | 119 ++ examples/train_backtest_analyze.ipynb | 355 +++++ qlib/__init__.py | 197 +++ qlib/config.py | 167 ++ qlib/contrib/__init__.py | 0 qlib/contrib/backtest/__init__.py | 9 + qlib/contrib/backtest/account.py | 174 ++ qlib/contrib/backtest/backtest.py | 128 ++ qlib/contrib/backtest/exchange.py | 430 +++++ qlib/contrib/backtest/order.py | 29 + qlib/contrib/backtest/position.py | 207 +++ qlib/contrib/backtest/profit_attribution.py | 324 ++++ qlib/contrib/backtest/report.py | 106 ++ qlib/contrib/estimator/__init__.py | 0 qlib/contrib/estimator/config.py | 176 +++ qlib/contrib/estimator/estimator.py | 323 ++++ qlib/contrib/estimator/fetcher.py | 290 ++++ qlib/contrib/estimator/handler.py | 585 +++++++ qlib/contrib/estimator/launcher.py | 116 ++ qlib/contrib/estimator/processor.py | 249 +++ qlib/contrib/estimator/trainer.py | 315 ++++ qlib/contrib/evaluate.py | 396 +++++ qlib/contrib/evaluate_portfolio.py | 246 +++ qlib/contrib/model/__init__.py | 6 + qlib/contrib/model/base.py | 155 ++ qlib/contrib/model/gbdt.py | 91 ++ qlib/contrib/model/pytorch_nn.py | 356 +++++ qlib/contrib/online/__init__.py | 0 qlib/contrib/online/executor.py | 291 ++++ qlib/contrib/online/manager.py | 147 ++ qlib/contrib/online/online_model.py | 36 + qlib/contrib/online/operator.py | 317 ++++ qlib/contrib/online/user.py | 74 + qlib/contrib/online/utils.py | 110 ++ qlib/contrib/report/__init__.py | 11 + .../contrib/report/analysis_model/__init__.py | 4 + .../analysis_model_performance.py | 304 ++++ .../report/analysis_position/__init__.py | 8 + .../analysis_position/cumulative_return.py | 281 ++++ .../analysis_position/parse_position.py | 187 +++ .../report/analysis_position/rank_label.py | 127 ++ .../report/analysis_position/report.py | 220 +++ .../report/analysis_position/risk_analysis.py | 271 ++++ .../report/analysis_position/score_ic.py | 72 + qlib/contrib/report/graph.py | 370 +++++ qlib/contrib/strategy/__init__.py | 9 + qlib/contrib/strategy/cost_control.py | 73 + qlib/contrib/strategy/order_generator.py | 171 ++ qlib/contrib/strategy/strategy.py | 318 ++++ qlib/contrib/tuner/__init__.py | 0 qlib/contrib/tuner/config.py | 88 ++ qlib/contrib/tuner/launcher.py | 34 + qlib/contrib/tuner/pipeline.py | 86 + qlib/contrib/tuner/space.py | 17 + qlib/contrib/tuner/tuner.py | 218 +++ qlib/data/__init__.py | 36 + qlib/data/_libs/__init__.py | 2 + qlib/data/_libs/expanding.pyx | 152 ++ qlib/data/_libs/rolling.pyx | 207 +++ qlib/data/base.py | 229 +++ qlib/data/cache.py | 1149 ++++++++++++++ qlib/data/client.py | 102 ++ qlib/data/data.py | 1110 +++++++++++++ qlib/data/filter.py | 375 +++++ qlib/data/ops.py | 1405 +++++++++++++++++ qlib/log.py | 112 ++ qlib/utils.py | 547 +++++++ qlib/version.py | 0 scripts/data_collector/csi/README.md | 14 + scripts/data_collector/csi/collector.py | 213 +++ scripts/data_collector/csi/requirements.txt | 6 + scripts/data_collector/msn/README.md | 1 + scripts/data_collector/yahoo/README.md | 38 + scripts/data_collector/yahoo/collector.py | 254 +++ scripts/data_collector/yahoo/requirements.txt | 9 + scripts/dump_bin.py | 250 +++ scripts/get_data.py | 91 ++ setup.py | 110 ++ tests/test_all_pipeline.py | 173 ++ tests/test_dump_data.py | 88 ++ tests/test_get_data.py | 52 + 131 files changed, 20218 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGES.rst create mode 100644 docs/Makefile create mode 100644 docs/_static/img/analysis/analysis_model_IC.png create mode 100644 docs/_static/img/analysis/analysis_model_NDQ.png create mode 100644 docs/_static/img/analysis/analysis_model_auto_correlation.png create mode 100644 docs/_static/img/analysis/analysis_model_cumulative_return.png create mode 100644 docs/_static/img/analysis/analysis_model_long_short.png create mode 100644 docs/_static/img/analysis/analysis_model_monthly_IC.png create mode 100644 docs/_static/img/analysis/analysis_model_top_bottom_turnover.png create mode 100644 docs/_static/img/analysis/cumulative_return_buy.png create mode 100644 docs/_static/img/analysis/cumulative_return_buy_minus_sell.png create mode 100644 docs/_static/img/analysis/cumulative_return_hold.png create mode 100644 docs/_static/img/analysis/cumulative_return_sell.png create mode 100644 docs/_static/img/analysis/rank_label_buy.png create mode 100644 docs/_static/img/analysis/rank_label_hold.png create mode 100644 docs/_static/img/analysis/rank_label_sell.png create mode 100644 docs/_static/img/analysis/report.png create mode 100644 docs/_static/img/analysis/risk_analysis_annual.png create mode 100644 docs/_static/img/analysis/risk_analysis_bar.png create mode 100644 docs/_static/img/analysis/risk_analysis_mdd.png create mode 100644 docs/_static/img/analysis/risk_analysis_sharpe.png create mode 100644 docs/_static/img/analysis/risk_analysis_std.png create mode 100644 docs/_static/img/analysis/score_ic.png create mode 100644 docs/_static/img/framework.png create mode 100644 docs/_static/img/topk_drop.png create mode 100644 docs/advanced/alpha.rst create mode 100644 docs/changelog/changelog.rst create mode 100644 docs/component/backtest.rst create mode 100644 docs/component/data.rst create mode 100644 docs/component/estimator.rst create mode 100644 docs/component/model.rst create mode 100644 docs/component/report.rst create mode 100644 docs/component/strategy.rst create mode 100644 docs/conf.py create mode 100644 docs/hidden/client.rst create mode 100644 docs/hidden/online.rst create mode 100644 docs/hidden/tuner.rst create mode 100644 docs/index.rst create mode 100644 docs/introduction/introduction.rst create mode 100644 docs/reference/api.rst create mode 100644 docs/requirements.txt create mode 100644 docs/start/getdata.rst create mode 100644 docs/start/initialization.rst create mode 100644 docs/start/installation.rst create mode 100644 docs/start/integration.rst create mode 100644 examples/estimator/analyze_from_estimator.ipynb create mode 100644 examples/estimator/estimator_config.yaml create mode 100644 examples/estimator/estimator_config_dnn.yaml create mode 100644 examples/train_and_backtest.py create mode 100644 examples/train_backtest_analyze.ipynb create mode 100644 qlib/__init__.py create mode 100644 qlib/config.py create mode 100644 qlib/contrib/__init__.py create mode 100644 qlib/contrib/backtest/__init__.py create mode 100644 qlib/contrib/backtest/account.py create mode 100644 qlib/contrib/backtest/backtest.py create mode 100644 qlib/contrib/backtest/exchange.py create mode 100644 qlib/contrib/backtest/order.py create mode 100644 qlib/contrib/backtest/position.py create mode 100644 qlib/contrib/backtest/profit_attribution.py create mode 100644 qlib/contrib/backtest/report.py create mode 100644 qlib/contrib/estimator/__init__.py create mode 100644 qlib/contrib/estimator/config.py create mode 100644 qlib/contrib/estimator/estimator.py create mode 100644 qlib/contrib/estimator/fetcher.py create mode 100644 qlib/contrib/estimator/handler.py create mode 100644 qlib/contrib/estimator/launcher.py create mode 100644 qlib/contrib/estimator/processor.py create mode 100644 qlib/contrib/estimator/trainer.py create mode 100644 qlib/contrib/evaluate.py create mode 100644 qlib/contrib/evaluate_portfolio.py create mode 100644 qlib/contrib/model/__init__.py create mode 100644 qlib/contrib/model/base.py create mode 100644 qlib/contrib/model/gbdt.py create mode 100644 qlib/contrib/model/pytorch_nn.py create mode 100644 qlib/contrib/online/__init__.py create mode 100644 qlib/contrib/online/executor.py create mode 100644 qlib/contrib/online/manager.py create mode 100644 qlib/contrib/online/online_model.py create mode 100644 qlib/contrib/online/operator.py create mode 100644 qlib/contrib/online/user.py create mode 100644 qlib/contrib/online/utils.py create mode 100644 qlib/contrib/report/__init__.py create mode 100644 qlib/contrib/report/analysis_model/__init__.py create mode 100644 qlib/contrib/report/analysis_model/analysis_model_performance.py create mode 100644 qlib/contrib/report/analysis_position/__init__.py create mode 100644 qlib/contrib/report/analysis_position/cumulative_return.py create mode 100644 qlib/contrib/report/analysis_position/parse_position.py create mode 100644 qlib/contrib/report/analysis_position/rank_label.py create mode 100644 qlib/contrib/report/analysis_position/report.py create mode 100644 qlib/contrib/report/analysis_position/risk_analysis.py create mode 100644 qlib/contrib/report/analysis_position/score_ic.py create mode 100644 qlib/contrib/report/graph.py create mode 100644 qlib/contrib/strategy/__init__.py create mode 100644 qlib/contrib/strategy/cost_control.py create mode 100644 qlib/contrib/strategy/order_generator.py create mode 100644 qlib/contrib/strategy/strategy.py create mode 100644 qlib/contrib/tuner/__init__.py create mode 100644 qlib/contrib/tuner/config.py create mode 100644 qlib/contrib/tuner/launcher.py create mode 100644 qlib/contrib/tuner/pipeline.py create mode 100644 qlib/contrib/tuner/space.py create mode 100644 qlib/contrib/tuner/tuner.py create mode 100644 qlib/data/__init__.py create mode 100644 qlib/data/_libs/__init__.py create mode 100644 qlib/data/_libs/expanding.pyx create mode 100644 qlib/data/_libs/rolling.pyx create mode 100644 qlib/data/base.py create mode 100644 qlib/data/cache.py create mode 100644 qlib/data/client.py create mode 100644 qlib/data/data.py create mode 100644 qlib/data/filter.py create mode 100644 qlib/data/ops.py create mode 100644 qlib/log.py create mode 100644 qlib/utils.py create mode 100644 qlib/version.py create mode 100644 scripts/data_collector/csi/README.md create mode 100644 scripts/data_collector/csi/collector.py create mode 100644 scripts/data_collector/csi/requirements.txt create mode 100644 scripts/data_collector/msn/README.md create mode 100644 scripts/data_collector/yahoo/README.md create mode 100644 scripts/data_collector/yahoo/collector.py create mode 100644 scripts/data_collector/yahoo/requirements.txt create mode 100644 scripts/dump_bin.py create mode 100644 scripts/get_data.py create mode 100644 setup.py create mode 100644 tests/test_all_pipeline.py create mode 100644 tests/test_dump_data.py create mode 100644 tests/test_get_data.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..5c8ce5e3a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# https://github.com/github/gitignore/blob/master/Python.gitignore +__pycache__/ + +*.pyc +*.so +*.ipynb +.ipynb_checkpoints +_build +build/ +dist/ + + +*.pkl +*.hd5 +*.csv + +.env +.vim +.nvimrc +.vscode + +qlib/data/_libs/expanding.cpp +qlib/data/_libs/rolling.cpp +examples/estimator/estimator_example/ + +*.egg-info/ + + +# special software +mlruns/ + +tags + diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 000000000..a340b19e1 --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,152 @@ +Changelog +==================== +Here you can see the full list of changes between each QLib release. + +Version 0.1.0 +-------------------- +This is the initial release of QLib library. + +Version 0.1.1 +-------------------- +Performance optimize. Add more features and operators. + +Version 0.1.2 +-------------------- +- Support operator syntax. Now ``High() - Low()`` is equivalent to ``Sub(High(), Low())``. +- Add more technical indicators. + +Version 0.1.3 +-------------------- +Bug fix and add instruments filtering mechanism. + +Version 0.2.0 +-------------------- +- Redesign ``LocalProvider`` database format for performance improvement. +- Support load features as string fields. +- Add scripts for database construction. +- More operators and technical indicators. + +Version 0.2.1 +-------------------- +- Support registering user-defined ``Provider``. +- Support use operators in string format, e.g. ``['Ref($close, 1)']`` is valid field format. +- Support dynamic fields in ``$some_field`` format. And exising fields like ``Close()`` may be deprecated in the future. + +Version 0.2.2 +-------------------- +- Add ``disk_cache`` for reusing features (enabled by default). +- Add ``qlib.contrib`` for experimental model construction and evaluation. + + +Version 0.2.3 +-------------------- +- Add ``backtest`` module +- Decoupling the Strategy, Account, Position, Exchange from the backtest module + +Version 0.2.4 +-------------------- +- Add ``profit attribution`` module +- Add ``rick_control`` and ``cost_control`` strategies + +Version 0.3.0 +-------------------- +- Add ``estimator`` module + +Version 0.3.1 +-------------------- +- Add ``filter`` module + +Version 0.3.2 +-------------------- +- Add real price trading, if the ``factor`` field in the data set is incomplete, use ``adj_price`` trading +- Refactor ``handler`` ``launcher`` ``trainer`` code +- Support ``backtest`` configuration parameters in the configuration file +- Fix bug in position ``amount`` is 0 +- Fix bug of ``filter`` module + +Version 0.3.3 +------------------- +- Fix bug of ``filter`` module + +Version 0.3.4 +-------------------- +- Support for ``finetune model`` +- Refactor ``fetcher`` code + +Version 0.3.5 +-------------------- +- Support multi-label training, you can provide multiple label in ``handler``. (But LightGBM doesn't support due to the algorithm itself) +- Refactor ``handler`` code, dataset.py is no longer used, and you can deploy your own labels and features in ``feature_label_config`` +- Handler only offer DataFrame. Also, ``trainer`` and model.py only receive DataFrame +- Change ``split_rolling_data``, we roll the data on market calender now, not on normal date +- Move some date config from ``handler`` to ``trainer`` + +Version 0.4.0 +-------------------- +- Add `data` package that holds all data-related codes +- Reform the data provider structure +- Create a server for data centralized management `qlib-server`_ +- Add a `ClientProvider` to work with server +- Add a pluggable cache mechanism +- Add a recursive backtracking algorithm to inspect the furthest reference date for an expression + +.. note:: + The ``D.instruments`` function does not support ``start_time``, ``end_time``, and ``as_list`` parameters, if you want to get the results of previous versions of ``D.instruments``, you can do this: + + + >>> from qlib.data import D + >>> instruments = D.instruments(market='csi500') + >>> D.list_instruments(instruments=instruments, start_time='2015-01-01', end_time='2016-02-15', as_list=True) + + +Version 0.4.1 +-------------------- +- Add support Windows +- Fix ``instruments`` type bug +- Fix ``features`` is empty bug(It will cause failure in updating) +- Fix ``cache`` lock and update bug +- Fix use the same cache for the same field (the original space will add a new cache) +- Change "logger handler" from config +- Change model load support 0.4.0 later +- The default value of the ``method`` parameter of ``risk_analysis`` function is changed from **ci** to **si** + + +Version 0.4.2 +-------------------- +- Refactor DataHandler +- Add ``ALPHA360`` DataHandler + + +Version 0.4.3 +-------------------- +- Implementing Online Inference and Trading Framework +- Refactoring The interfaces of backtest and strategy module. + + +Version 0.4.4 +-------------------- +- Optimize cache generation performance +- Add report module +- Fix bug when using ``ServerDatasetCache`` offline. +- In the previous version of ``long_short_backtest``, there is a case of ``np.nan`` in long_short. The current version ``0.4.4`` has been fixed, so ``long_short_backtest`` will be different from the previous version. +- In the ``0.4.2`` version of ``risk_analysis`` function, ``N`` is ``250``, and ``N`` is ``252`` from ``0.4.3``, so ``0.4.2`` is ``0.002122`` smaller than the ``0.4.3`` the backtest result is slightly different between ``0.4.2`` and ``0.4.3``. +- refactor the argument of backtest function. + - **NOTE**: + - The default arguments of topk margin strategy is changed. Please pass the arguments explicitly if you want to get the same backtest result as previous version. + - The TopkWeightStrategy is changed slightly. It will try to sell the stocks more than ``topk``. (The backtest result of TopkAmountStrategy remains the same) +- The margin ratio mechanism is supported in the Topk Margin strategies. + + +Version 0.4.5 +-------------------- +- Add multi-kernel implementation for both client and server. + - Support a new way to load data from client which skips dataset cache. + - Change the default dataset method from single kernel implementation to multi kernel implementation. +- Accelerate the high frequency data reading by optimizing the relative modules. +- Support a new method to write config file by using dict. + +Version 0.4.6 +-------------------- +- Some bugs are fixed + - The default config in `Version 0.4.5` is not friendly to daily frequency data. + - Backtest error in TopkWeightStrategy when `WithInteract=True`. diff --git a/README.md b/README.md index 8eeee9c7c..bf955e61d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,199 @@ +Qlib is an AI-oriented quantitative investment platform, which aims to realize the potential, empower the research, and create the value of AI technologies in quantitative investment. + +With Qlib, you can easily apply your favorite model to create a better Quant investment strategy. + + +- [Framework of Qlib](#framework-of-qlib) +- [Quick start](#quick-start) + - [Installation](#installation) + - [Get Data](#get-data) + - [Auto Quant research workflow with _estimator_](#auto-quant-research-workflow-with-estimator) + - [Customized Quant research workflow by code](#customized-quant-research-workflow-by-code) +- [More About Qlib](#more-about-qlib) + - [Offline mode and online mode](#offline-mode-and-online-mode) + - [Performance of Qlib Data Server](#performance-of-qlib-data-server) +- [Contributing](#contributing) + + + +# Framework of Qlib +![framework](docs/_static/img/framework.png) + +At the module level, Qlib is a platform that consists of the above components. Each component is loose-coupling and can be used stand-alone. + +| Name | Description | +| ------ | ----- | +| _Data layer_ | _DataServer_ focus on providing high performance infrastructure for user to retrieve and get raw data. _DataEnhancement_ will preprocess the data and provide the best dataset to be fed in to the models | +| _Interday Model_ | _Interday model_ focus on producing forecasting signals(aka. _alpha_). Models are trained by _Model Creator_ and managed by _Model Manager_. User could choose one or multiple models for forecasting. Multiple models could be combined with _Ensemble_ module | +| _Interday Strategy_ | _Portfolio Generator_ will take forecasting signals as input and output the orders based on current position to achieve target portfolio | +| _Intraday Trading_ | _Order Executor_ is responsible for executing orders produced by _Interday Strategy_ and returning the executed results. | +| _Analysis_ | User could get detailed analysis report of forecasting signal and portfolio in this part. | + +* The modules with hand-drawn style is under development and will be released in the future. +* The modules with dashed border is highly user-customizable and extendible. + + +# Quick start + +## Installation + +To install Qlib from source you need _Cython_ in addition to the normal dependencies above: + +```bash +pip install numpy +pip install --upgrade cython +``` + +Clone the repository and then run: +```bash +python setup.py install +``` + + +## Get Data +- Load and prepare the Data: execute the following command to load the stock data: + ```bash + python scripts/get_data.py qlib_data_cn --target_dir ~/.qlib/qlib_data/cn_data + ``` + + +## Auto Quant research workflow with _estimator_ +Qlib provides a tool named `estimator` to run whole workflow automatically(including building dataset, train models, backtest, analysis) + +1. Run _estimator_ (_config.yaml_ for: [estimator_config.yaml](examples/estimator/estimator_config.yaml)): + + ```bash + cd examples # Avoid running program under the directory contains `qlib` + estimator -c estimator/estimator_config.yaml + ``` + + Estimator result: + + ```bash + + risk + sub_bench mean 0.000662 + std 0.004487 + annual 0.166720 + sharpe 2.340526 + mdd -0.080516 + sub_cost mean 0.000577 + std 0.004482 + annual 0.145392 + sharpe 2.043494 + mdd -0.083584 + ``` + See the full documents for [Use _Estimator_ to Start An Experiment](TODO:URL). + +2. Analysis + + Run `examples/estimator/analyze_from_estimator.ipynb` in `jupyter notebook` + 1. forecasting signal analysis + - Cumulative Return + + ![Cumulative Return](docs/_static/img/analysis/analysis_model_cumulative_return.png) + ![long_short](docs/_static/img/analysis/analysis_model_long_short.png) + - Information Coefficient(IC) + + ![Information Coefficient](docs/_static/img/analysis/analysis_model_IC.png) + ![Monthly IC](docs/_static/img/analysis/analysis_model_monthly_IC.png) + ![IC](docs/_static/img/analysis/analysis_model_NDQ.png) + - Auto Correlation + + ![Auto Correlation](docs/_static/img/analysis/analysis_model_auto_correlation.png) + + + + + 2. portfolio analysis + - Report + + ![Report](docs/_static/img/analysis/report.png) + + +## Customized Quant research workflow by code +Automatic workflow may not suite the research workflow of all Quant researchers. To support flexible Quant research workflow, Qlib also provide modularized interface to allow researchers to build their own workflow. [Here](TODO_URL) is a demo for customized Quant research workflow by code + + + +# More About Qlib +The detailed documents are organized in [docs](docs). +[Sphinx](http://www.sphinx-doc.org) and the readthedocs theme is required to build the documentation in html formats. +```bash +cd docs/ +conda install sphinx sphinx_rtd_theme -y +# Otherwise, you can install them with pip +# pip install sphinx sphinx_rtd_theme +make html +``` +You can also view the [latest document](TODO_URL) online directly. + +The roadmap is managed as a [github project](https://github.com/microsoft/qlib/projects/1). + + + +## Offline mode and online mode +The data server of Qlib can both deployed as offline mode and online mode. The default mode is offline mode. + +Under offline mode, the data will be deployed locally. + +Under online mode, the data will be deployed as a shared data service. The data and their cache will be shared by clients. The data retrieving performance is expected to be improved due to a higher rate of cache hits. It will use less disk space, too. The documents of the online mode can be found in [Qlib-Server](TODO_link). The online mode can be deployed automatically with [Azure CLI based scripts](TODO_link) + +## Performance of Qlib Data Server +The performance of data processing is important to data-driven methods like AI technologies. As an AI-oriented platform, Qlib provides a solution for data storage and data processing. To demonstrate the performance of Qlib, We +compare Qlib with several other solutions. + +We evaluate the performance of several solutions by completing the same task, +which creates a dataset(14 features/factors) from the basic OHLCV daily data of a stock market(800 stocks each day from 2007 to 2020). The task involves data queries and processing. + +| | HDF5 | MySQL | MongoDB | InfluxDB | Qlib -E -D | Qlib +E -D | Qlib +E +D | +| -- | ------ | ------ | -------- | --------- | ----------- | ------------ | ----------- | +| Total (1CPU) (seconds) | 184.4±3.7 | 365.3±7.5 | 253.6±6.7 | 368.2±3.6 | 147.0±8.8 | 47.6±1.0 | **7.4±0.3** | +| Total (64CPU) (seconds) | | | | | 8.8±0.6 | **4.2±0.2** | | +* `+(-)E` indicates with(out) `ExpressionCache` +* `+(-)D` indicates with(out) `DatasetCache` + +Most general-purpose databases take too much time on loading data. After looking into the underlying implementation, we find that data go through too many layers of interfaces and unnecessary format transformations in general-purpose database solutions. +Such overheads greatly slow down the data loading process. +Qlib data are stored in a compact format, which is efficient to be combined into arrays for scientific computation. + + + + # Contributing diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..11ee1e798 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python3 -msphinx +SPHINXPROJ = Quantlab +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/img/analysis/analysis_model_IC.png b/docs/_static/img/analysis/analysis_model_IC.png new file mode 100644 index 0000000000000000000000000000000000000000..157324babe5b024ab1dd8e41a61fafbdf9bd5a74 GIT binary patch literal 37797 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 NzE+YdePtN%zW{n7L45!K literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/analysis_model_NDQ.png b/docs/_static/img/analysis/analysis_model_NDQ.png new file mode 100644 index 0000000000000000000000000000000000000000..6f95ed65d0f4c534cbc2a2ee6f3b987974581d7d GIT binary patch literal 24455 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 Td5=mluDrR>O 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 Bzvut} literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/risk_analysis_annual.png b/docs/_static/img/analysis/risk_analysis_annual.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2b4ee40f811443b8e0d37660dc2b7c408c7335 GIT binary patch literal 51666 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/risk_analysis_bar.png b/docs/_static/img/analysis/risk_analysis_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6d4b9c517656fa04a675e2fba0a6331128ac2e GIT binary patch literal 12087 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/risk_analysis_mdd.png b/docs/_static/img/analysis/risk_analysis_mdd.png new file mode 100644 index 0000000000000000000000000000000000000000..43cdcc9b6be177541d3eec35745ba4f89b21439b GIT binary patch literal 55467 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/risk_analysis_sharpe.png b/docs/_static/img/analysis/risk_analysis_sharpe.png new file mode 100644 index 0000000000000000000000000000000000000000..29ac61651d6d1f056ade314b660f7dec72aaf6ff GIT binary patch literal 54703 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

*NuLptmc!|} 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 MqchVlBAo$BT@HLA|k^P!m=o|9@KXhOxl}mLN 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 literal 0 HcmV?d00001 diff --git a/docs/advanced/alpha.rst b/docs/advanced/alpha.rst new file mode 100644 index 000000000..63a8be777 --- /dev/null +++ b/docs/advanced/alpha.rst @@ -0,0 +1,104 @@ +.. _alpha: +=========================== +Building Formulaic Alphas +=========================== +.. currentmodule:: qlib + +Introduction +=================== + +In quantitative trading practice, designing novel factors that can explain and predict future asset returns are of vital importance to the profitability of a strategy. Such factors are usually called alpha factors, or alphas in short. + + +A formulaic alpha, as the name suggests, is a kind of alpha that can be presented as a formula or a mathematical expression. + + +Building Formulaic Alphas in ``Qlib`` +====================================== + +In ``Qlib``, users can easily build formulaic alphas. + +Example +----------------- + +`MACD`, short for moving average convergence/divergence, is a formulaic alpha used in technical analysis of stock prices. It is designed to reveal changes in the strength, direction, momentum, and duration of a trend in a stock's price. + +`MACD` can be presented as the following formula: + +.. math:: + + MACD = 2\times (DIF-DEA) + +.. note:: + + `DIF` means Differential value, which is 12-period EMA minus 26-period EMA. + + .. math:: + + DIF = \frac{EMA(CLOSE, 12) - EMA(CLOSE, 26)}{CLOSE} + + `DEA`means a 9-period EMA of the DIF. + + .. math:: + + DEA = \frac{EMA(DIF, 9)}{CLOSE} + +Users can use ``Data Handler`` to build formulaic alphas `MACD` in qlib: + +.. note:: Users need to initialize ``Qlib`` with `qlib.init` first. Please refer to `initialization `_. + +.. code-block:: python + + >>> from qlib.contrib.estimator.handler import QLibDataHandler + >>> fields = ['(EMA($close, 12) - EMA($close, 26))/$close - EMA((EMA($close, 12) - EMA($close, 26))/$close, 9)/$close'] # MACD + >>> names = ['MACD'] + >>> labels = ['Ref($vwap, -2)/Ref($vwap, -1) - 1'] # label + >>> label_names = ['LABEL'] + >>> data_handler = QLibDataHandler(start_date='2010-01-01', end_date='2017-12-31', fields=fields, names=names, labels=labels, label_names=label_names) + >>> TRAINER_CONFIG = { + ... "train_start_date": "2007-01-01", + ... "train_end_date": "2014-12-31", + ... "validate_start_date": "2015-01-01", + ... "validate_end_date": "2016-12-31", + ... "test_start_date": "2017-01-01", + ... "test_end_date": "2020-08-01", + ... } + >>> feature_train, label_train, feature_validate, label_validate, feature_test, label_test = data_handler.get_split_data(**TRAINER_CONFIG) + >>> print(feature_train, label_train) + MACD + instrument datetime + SH600004 2012-01-04 -0.030853 + 2012-01-05 -0.030452 + 2012-01-06 -0.028252 + 2012-01-09 -0.024507 + 2012-01-10 -0.019744 + ... ... + SZ300273 2014-12-25 0.031339 + 2014-12-26 0.029695 + 2014-12-29 0.025577 + 2014-12-30 0.020493 + 2014-12-31 0.017089 + + [605882 rows x 1 columns] + label + instrument datetime + SH600004 2012-01-04 0.003021 + 2012-01-05 0.017434 + 2012-01-06 0.015490 + 2012-01-09 0.002324 + 2012-01-10 -0.002542 + ... ... + SZ300273 2014-12-25 -0.032454 + 2014-12-26 -0.016638 + 2014-12-29 0.008263 + 2014-12-30 -0.011985 + 2014-12-31 0.047797 + + [605882 rows x 1 columns] + +Reference +=========== + +To kown more about ``Data Handler``, please refer to `Data Handler <../component/data.html>`_ + +To kown more about ``Data Api``, please refer to `Data Api <../component/data.html>`_ \ No newline at end of file diff --git a/docs/changelog/changelog.rst b/docs/changelog/changelog.rst new file mode 100644 index 000000000..241402929 --- /dev/null +++ b/docs/changelog/changelog.rst @@ -0,0 +1,2 @@ +.. include:: ../../CHANGES.rst + diff --git a/docs/component/backtest.rst b/docs/component/backtest.rst new file mode 100644 index 000000000..614eab830 --- /dev/null +++ b/docs/component/backtest.rst @@ -0,0 +1,106 @@ +.. _backtest: +============================================ +Intraday Trading: Model&Strategy Testing +============================================ +.. currentmodule:: qlib + +Introduction +=================== + +``Intraday Trading`` is designed to test models and strategies, which help users to check the performance of custom model/strategy. + + +.. note:: + + ``Intraday Trading`` uses ``Order Executor`` to trade and execute orders output by ``Interday Strategy``. ``Order Executor`` is a component in `Qlib Framework <../introduction/introduction.html#framework>`_, which can execute orders. ``Vwap Executor`` and ``Close Executor`` is supported by ``Qlib`` now. In the future, ``Qlib`` will support ``HighFreq Executor`` also. + + + +Example +=========================== + +Users need to generate a prediction score(a pandas DataFrame) with MultiIndex and a `score` column. And users need to assign a strategy used in backtest, if strategy is not assigned, +a `TopkDropoutStrategy` strategy with `(topk=50, n_drop=5, risk_degree=0.95, limit_threshold=0.0095)` will be used. +If ``Strategy`` module is not user's interested part, `TopkDropoutStrategy` is enough. + +The simple example with default strategy is as follows. + +.. code-block:: python + + from qlib.contrib.evaluate import backtest + # pred_score is the prediction score + report, positions = backtest(pred_score, topk=50, n_drop=0.5, verbose=False, limit_threshold=0.0095) + +To know more about backtesting with specific strategy, please refer to `Strategy `_. + +To know more about the prediction score `pred_score` output by ``Model``, please refer to `Interday Model: Model Training & Prediction `_. + +Prediction Score +----------------- + +The prediction score is a pandas DataFrame. Its index is and it must +contains a `score` column. + +A prediction sample is shown as follows. + +.. code-block:: python + + instrument datetime score + SH600000 2019-01-04 -0.505488 + SZ002531 2019-01-04 -0.320391 + SZ000999 2019-01-04 0.583808 + SZ300569 2019-01-04 0.819628 + SZ001696 2019-01-04 -0.137140 + ... ... + SZ000996 2019-04-30 -1.027618 + SH603127 2019-04-30 0.225677 + SH603126 2019-04-30 0.462443 + SH603133 2019-04-30 -0.302460 + SZ300760 2019-04-30 -0.126383 + +``Model`` module can make predictions, please refer to `Model `_. + +Backtest Result +------------------ + +The backtest results are in the following form: + +.. code-block:: python + + sub_bench mean 0.000662 + std 0.004487 + annual 0.166720 + sharpe 2.340526 + mdd -0.080516 + sub_cost mean 0.000577 + std 0.004482 + annual 0.145392 + sharpe 2.043494 + mdd -0.083584 + +- `sub_bench` + Returns of the portfolio without deduction of fees + +- `sub_cost` + Returns of the portfolio with deduction of fees + +- `mean` + Mean value of the returns sequence(difference sequence of assets). + +- `std` + Standard deviation of the returns sequence(difference sequence of assets). + +- `annual` + Average annualized returns of the portfolio. + +- `ir` + Information Ratio, please refer to `Information Ratio – IR `_. + +- `mdd` + Maximum Drawdown, please refer to `Maximum Drawdown (MDD) `_. + + +Reference +============== + +To know more about ``Intraday Trading``, please refer to `Backtest API <../reference/api.html>`_. diff --git a/docs/component/data.rst b/docs/component/data.rst new file mode 100644 index 000000000..4f8969969 --- /dev/null +++ b/docs/component/data.rst @@ -0,0 +1,333 @@ +.. _data: +================================ +Data Layer: Data Framework&Usage +================================ + +Introduction +============================ + +``Data Layer`` is designed to download raw data, retrieve data, construct datasets and get frequently-used data. + +Also, users can building formulaic alphas with ``Data Layer`` easliy. If users are interesting formulaic alphas, please refer to `Building Formulaic Alphas <../advanced/alpha.html>`_. + +The ``Data Layer`` framework includes four components as follows. + +- Raw Data +- Data API +- Data Handler +- Cache + + + +Raw Data +============================ + +``Qlib`` provides the script ``scripts/get_data.py`` to download the raw data that will be used to initialize the qlib package, please refer to `Initialization <../start/initialization.rst>`_. + +When ``Qlib`` is initialized, users can choose china-stock mode or US-stock mode, please refer to `Initialization <../start/initialization.rst>`_. + +China-Stock Market Mode +-------------------------------- + +If users use ``Qlib`` in china-stock mode, china-stock data is required. The script ``scripts/get_data.py`` can be used to download china-stock data. If users want to use ``Qlib`` in china-stock mode, they need to do as follows. + +- Download data in qlib format + Run the following command to download china-stock data in csv format. + + .. code-block:: bash + + python scripts/get_data.py qlib_data_cn --target_dir ~/.qlib/qlib_data/cn_data + + Users can find china-stock data in qlib format in the'~/.qlib/csv_data/cn_data' directory. + +- Initialize ``Qlib`` in china-stock mode + Users only need to initialize ``Qlib`` as follows. + + .. code-block:: python + + from qlib.config import REG_CN + qlib.init(provider_uri='~/.qlib/qlib_data/cn_data', region=REG_CN) + + +US-Stock Market Mode +------------------------- +If users use ``Qlib`` in US-stock mode, US-stock data is required. ``Qlib`` does not provide script to download US-stock data. If users want to use ``Qlib`` in US-stock market mode, they need to do as follows. + +- Prepare data in csv format + Users need to prepare US-stock data in csv format by themselves, which is in the same format as the china-stock data in csv format. Please download the china-stock data in csv format as follows for reference of format. + + .. code-block:: bash + + python scripts/get_data.py csv_data_cn --target_dir ~/.qlib/csv_data/cn_data + + +- Convert data from csv format to ``Qlib`` format + ``Qlib`` provides the script ``scripts/dump_bin.py`` to convert data from csv format to qlib format. + Assuming that the users store the US-stock data in csv format in path '~/.qlib/csv_data/us_data', they need to execute the following command to convert the data from csv format to ``Qlib`` format: + + .. code-block:: bash + + python scripts/dump_bin.py dump --csv_path ~/.qlib/csv_data/us_data --qlib_dir ~/.qlib/qlib_data/us_data --include_fields open,close,high,low,volume,factor + +- Initialize ``Qlib`` in US-stock mode + Users only need to initialize ``Qlib`` as follows. + + .. code-block:: python + + from qlib.config import REG_US + qlib.init(provider_uri='~/.qlib/qlib_data/us_data', region=REG_US) + + +Please refer to `Script API <../reference/api.html>`_ for more details. + +Data API +======================== + +Data Retrieval +--------------- +Users can use APIs in ``qlib.data`` to retrieve data, please refer to `Data Retrieval <../start/getdata.html>`_. + +Feature +------------------ + +``Qlib`` provides `Feature` and `ExpressionOps` to fetch the features according to users' need. + +- `Feature` + Load data from data provider. + +- `ExpressionOps` + `ExpressionOps` will use operator for feature construction. + To know more about ``Operator``, please refer to `Operator API <../reference/api.html>`_. + +To know more about ``Feature``, please refer to `Feature API <../reference/api.html>`_. + +Filter +------------------- +``Qlib`` provides `NameDFilter` and `ExpressionDFilter` to filter the instruments according to users' need. + +- `NameDFilter` + Name dynamic instrument filter. Filter the instruments based on a regulated name format. A name rule regular expression is required. + +- `ExpressionDFilter` + Expression dynamic instrument filter. Filter the instruments based on a certain expression. An expression rule indicating a certain feature field is required. + + - `basic features filter`: rule_expression = '$close/$open>5' + - `cross-sectional features filter` : rule_expression = '$rank($close)<10' + - `time-sequence features filter`: rule_expression = '$Ref($close, 3)>100' + +To know more about ``Filter``, please refer to `Filter API <../reference/api.html>`_. + + +API +------------- + +To know more about ``Data Api``, please refer to `Data Api <../reference/api.html>`_. + +Data Handler +================= + +``Data Handler`` is a part of ``estimator`` and can also be used as a single module. + +``Data Handler`` can be used to load raw data, prepare features and label columns, preprocess data(standardization, remove NaN, etc.), split training, validation, and test sets. It is a subclass of ``qlib.contrib.estimator.handler.BaseDataHandler``, which provides some interfaces, for example: + +Base Class & Interface +---------------------- + +Qlib provides a base class `qlib.contrib.estimator.BaseDataHandler <../reference/api.html#class-qlib.contrib.estimator.BaseDataHandler>`_, which provides the following interfaces: + +- `setup_feature` + Implement the interface to load the data features. + +- `setup_label` + Implement the interface to load the data labels and calculate user's labels. + +- `setup_processed_data` + Implement the interface for data preprocessing, such as preparing feature columns, discarding blank lines, and so on. + +Qlib also provides two functions to help user init the data handler, user can override them for user's need. + +- `_init_kwargs` + User can init the kwargs of the data handler in this function, some kwargs may be used when init the raw df. + Kwargs are the other attributes in data.args, like dropna_label, dropna_feature + +- `_init_raw_df` + User can init the raw df, feature names and label names of data handler in this function. + If the index of feature df and label df are not same, user need to override this method to merge them (e.g. inner, left, right merge). + +If users want to load features and labels by config, users can inherit ``qlib.contrib.estimator.handler.ConfigDataHandler``, ``Qlib`` also have provided some preprocess method in this subclass. +If users want to use qlib data, `QLibDataHandler` is recommended. Users can inherit their custom class from `QLibDataHandler`, which is also a subclass of `ConfigDataHandler`. + + +Usage +-------------- +'Data Handler' can be used as a single module, which provides the following mehtod: + +- `get_split_data` + - According to the start and end dates, return features and labels of the pandas DataFrame type used for the 'Model' + +- `get_rolling_data` + - According to the start and end dates, and `rolling_period`, an iterator is returned, which can be used to traverse the features and labels used for rolling. + + + + +Example +-------------- + +``Data Handler`` can be run with ``estimator`` by modifying the configuration file, and can also be used as a single module. + +Know more about how to run ``Data Handler`` with ``estimator``, please refer to `Estimator `_. + +Qlib provides implemented data handler `QLibDataHandlerV1`. The following example shows how to run 'QLibDataHandlerV1' as a single module. + +.. note:: User needs to initialize ``Qlib`` with `qlib.init` first, please refer to `initialization `_. + + +.. code-block:: Python + + from qlib.contrib.estimator.handler import QLibDataHandlerV1 + from qlib.contrib.model.gbdt import LGBModel + + DATA_HANDLER_CONFIG = { + "dropna_label": True, + "start_date": "2007-01-01", + "end_date": "2020-08-01", + "market": "csi500", + } + + TRAINER_CONFIG = { + "train_start_date": "2007-01-01", + "train_end_date": "2014-12-31", + "validate_start_date": "2015-01-01", + "validate_end_date": "2016-12-31", + "test_start_date": "2017-01-01", + "test_end_date": "2020-08-01", + } + + exampleDataHandler = QLibDataHandlerV1(**DATA_HANDLER_CONFIG) + + # example of 'get_split_data' + x_train, y_train, x_validate, y_validate, x_test, y_test = exampleDataHandler.get_split_data(**TRAINER_CONFIG) + + # example of 'get_rolling_data' + + for (x_train, y_train, x_validate, y_validate, x_test, y_test) in exampleDataHandler.get_rolling_data(**TRAINER_CONFIG): + print(x_train, y_train, x_validate, y_validate, x_test, y_test) + + +.. note:: (x_train, y_train, x_validate, y_validate, x_test, y_test) can be used as arguments for the ``fit``, ``predict``, and ``score`` methods of the 'Model' , please refer to `Model `_. + +Also, the above example has been given in ``examples.estimator.train_backtest_analyze.ipynb``. + +API +--------- + +To know more abot ``Data Handler``, please refer to `Data Handler API <../reference/api.html#handler>`_. + +Cache +========== + +``Cache`` is an optional module that helps accelerate providing data by saving some frequently-used data as cache file. + +Memory Cache +-------------- + +Base Class & Interface +~~~~~~~~~~~~~~~~~~~~~~~ + +``Qlib`` provides a `Memcache` class to cache the most-frequently-used data in memory, an inheritable `ExpressionCache` class, and an inheritable `DatasetCache` class. + +`Memcache` is a memory cache mechanism that composes of three `MemCacheUnit` instances to cache **Calendar**, **Instruments**, and **Features**. The MemCache is defined globally in `cache.py` as `H`. User can use `H['c'], H['i'], H['f']` to get/set memcache. + +.. autoclass:: qlib.data.cache.MemCacheUnit + :members: + +.. autoclass:: qlib.data.cache.MemCache + :members: + + +Disk Cache +-------------- + +Base Class & Interface +~~~~~~~~~~~~~~~~~~~~~~~ + +`ExpressionCache` is a disk cache mechanism that saves expressions such as **Mean($close, 5)**. Users can inherit this base class to define their own cache mechanism. Users need to override `self._uri` method to define how their cache file path is generated, `self._expression` method to define what data they want to cache and how to cache it. + +`DatasetCache` is a disk cache mechanism that saves datasets. A certain dataset is regulated by a stockpool configuration (or a series of instruments, though not recommended), a list of expressions or static feature fields, the start time and end time for the collected features and the frequency. Users need to override `self._uri` method to define how their cache file path is generated, `self._expression` method to define what data they want to cache and how to cache it. + +`ExpressionCache` and `DatasetCache` actually provides the same interfaces with `ExpressionProvider` and `DatasetProvider` so that the disk cache layer is transparent to users and will only be used if they want to define their own cache mechanism. The users can plug the cache mechanism into the server system by assigning the cache class they want to use in `config.py`: + +.. code-block:: python + + 'ExpressionCache': 'ServerExpressionCache', + 'DatasetCache': 'ServerDatasetCache', + +Users can find the cache interface here. + +ExpressionCache +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: qlib.data.cache.ExpressionCache + :members: + +DatasetCache +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: qlib.data.cache.DatasetCache + :members: + + +Implemented Disk Cache +~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + If the user does not use QlibServer, please ignore the content of this section + +Qlib has currently provided `ServerExpressionCache` class and `ServerDatasetCache` class as the cache mechanisms used for QlibServer. The class interface and file structure designed for server cache mechanism is listed below. + +DiskExpressionCache +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: qlib.data.cache.ServerExpressionCache + +DiskDatasetCache +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: qlib.data.cache.ServerDatasetCache + + +Data and Cache File Structure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: json + + - data/ + [raw data] updated by data providers + - calendars/ + - day.txt + - instruments/ + - all.txt + - csi500.txt + - ... + - features/ + - sh600000/ + - open.day.bin + - close.day.bin + - ... + - ... + [cached data] updated by server when raw data is updated + - calculated features/ + - sh600000/ + - [hash(instrtument, field_expression, freq)] + - all-time expression -cache data file + - .meta : an assorted meta file recording the instrument name, field name, freq, and visit times + - ... + - cache/ + - [hash(stockpool_config, field_expression_list, freq)] + - all-time Dataset-cache data file + - .meta : an assorted meta file recording the stockpool config, field names and visit times + - .index : an assorted index file recording the line index of all calendars + - ... + diff --git a/docs/component/estimator.rst b/docs/component/estimator.rst new file mode 100644 index 000000000..2556ae760 --- /dev/null +++ b/docs/component/estimator.rst @@ -0,0 +1,674 @@ +.. _estimator: +================================= +Estimator: Workflow Management +================================= +.. currentmodule:: qlib + +Introduction +=================== + +The components in `Qlib Framework <../introduction/introduction.html#framework>`_ is designed in a loosely-coupled way. Users could build their own quant research workflow with these components like `Example `_ + + +Besides, ``Qlib`` provides more user-friendly interfaces named ``Estimator`` to automatically run the whole workflow defined by a config. A concrete execution of the whole workflow is called an `experiment`. +With ``Estimator``, user can easily run an `experiment`, which includes the following steps: + +- Data + - Loading + - Processing + - Slicing +- Model + - Training and inference(static or rolling) + - Saving & loading +- Evaluation(Back-testing) + +For each `experiment`, ``Qlib`` will capture the details of model training, performance evalution results and basic infomation(e.g. names, ids). The captured data will be stored in backend-storge(disk or database). + +Example +=================== + +The following is an example: + +.. note:: Make sure install the latest version of `qlib`, please refer to `Qlib installation <../start/installation.html>`_. + +If users want to use the models and data provided by `Qlib`, they only need to do as follows. + +First, Write a simple configuration file as following, + +.. code-block:: YAML + + experiment: + name: estimator_example + observer_type: file_storage + mode: train + model: + class: LGBModel + module_path: qlib.contrib.model.gbdt + args: + loss: mse + colsample_bytree: 0.8879 + learning_rate: 0.0421 + subsample: 0.8789 + lambda_l1: 205.6999 + lambda_l2: 580.9768 + max_depth: 8 + num_leaves: 210 + num_threads: 20 + data: + class: QLibDataHandlerClose + args: + dropna_label: True + filter: + market: csi500 + trainer: + class: StaticTrainer + args: + rolling_period: 360 + train_start_date: 2007-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-12-31 + test_start_date: 2017-01-01 + test_end_date: 2020-08-01 + strategy: + class: TopkDropoutStrategy + args: + topk: 50 + n_drop: 5 + backtest: + normal_backtest_args: + verbose: False + limit_threshold: 0.095 + account: 100000000 + benchmark: SH000905 + deal_price: close + open_cost: 0.0005 + close_cost: 0.0015 + min_cost: 5 + qlib_data: + # when testing, please modify the following parameters according to the specific environment + provider_uri: "~/.qlib/qlib_data/cn_data" + region: "cn" + + +Then run the following command: + +.. code-block:: bash + + estimator -c configuration.yaml + +.. note:: 'estimator' is a built-in command of our program. + + + +Configuration File +=================== + +Before using ``estimator``, users need to prepare a configuration file. The following shows how to prepare each part of the configuration file. + +Experiment Field +-------------------- + +First, the configuration file needs to have a field about the experiment, whose key is `experiment`. This field and its contents determine how `estimator` tracks and persists this `experiment`. ``Qlib`` used `sacred`, a lightweight open-source tool designed to configure, organize, generate logs, and manage experiment results. The field `experiment` will determine the partial behavior of `sacred`. + +Usually, in the running process of `estimator`, those following will be managed by `sacred`: + +- `model.bin`, model binary file +- `pred.pkl`, model prediction result file +- `analysis.pkl`, backtest performance analysis file +- `positions.pkl`, backtest position record file +- `run`, the experiment information object, usually contains some meta information such as the experiment name, experiment date, etc. + +Usually, it should contain the following: + +.. code-block:: YAML + + experiment: + name: test_experiment + observer_type: mongo + mongo_url: mongodb://MONGO_URL + db_name: public + finetune: false + exp_info_path: /home/test_user/exp_info.json + mode: test + loader: + id: 677 + + +The meaning of each field is as follows: + +- `name` + The experiment name, str type, `sacred` will use this experiment name as an identifier for some important internal processes. Usually, users can see this field in `sacred` by `run` object. The default value is `test_experiment`. + +- `observer_type` + Observer type, str type, there are two values which are `file_storage` and `mongo` respectively. If it is `file_storage`, all the above-mentioned managed contents will be stored in the `dir` directory, separated by the number of times of experiments as a subfolder. If it is `mongo`, the content will be stored in the database. The default is `file_storage`. + + - For `file_storage` observer. + - `dir` + Directory url, str type, directory for `file_storage` observer type, files captures and managed by sacred with observer type of `file_storage` will be save to this directory, default is the directory of `config.json`. + + - For `mongo` observer. + - `mongo_url` + Database URL, str type, required if the observer type is `mongo`. + + - `db_name` + Database name, str type, required if the observer type is `mongo`. + +- `finetune` + Estimator will produce a model based on this flag + + The following table is the processing logic for different situations. + + ========== =========================================== ==================================== =========================================== ========================================== + . Static Rolling + . Finetune=True Finetune=False Finetune=True Finetune=False + ========== =========================================== ==================================== =========================================== ========================================== + Train - Need to provide model(Static or Rolling) - No need to provide model - Need to provide model(Static or Rolling) - Need to provide model(Static or Rolling) + - The args in model section will be - The args in model section will be - The args in model section will be - The args in model section will be + used for finetuning used for training used for finetuning used for finetuning + - Update based on the provided model - Train model from scratch - Update based on the provided model - Based on the provided model update + and parameters and parameters - Train model from scratch + - **Each rolling time slice is based on** - **Train each rolling time slice** + **a model updated from the previous** **separately** + **time** + Test - Model must exist, otherwise an exception will be raised. + - For `StaticTrainer`, users need to train a model and record 'exp_info' for 'Test'. + - For `RollingTrainer`, users need to train a set of models until the latest time, and record 'exp_info' for 'Test'. + ========== ============================================================================================================================================================================= + + .. note:: + + 1. finetune parameters: share model.args parameters. + + 2. provide model: from `loader.model_index`, load the index of the model(starting from 0). + + 3. If `loader.model_index` is None: + - In 'Static Finetune=True', if provide 'Rolling', use the last model to update. + + - For RollingTrainer with Finetune=Ture. + + - If StaticTrainer is used in loader, the model will be used for initialization for finetuning. + + - If RollingTrainer is used in loader, the existing models will be used without any modification and the new models will be initialized with the model in the last period and finetune one by one. + + +- `exp_info_path` + experiment info save path, str type, save the experiment info and model prediction score after the experiment is finished. Optional parameter, the default value is `config_file_dir/ex_name/exp_info.json` + +- `mode` + `train` or `test`, str type, if `mode` is test, it will load the model according to the parameters of `loader`. The default value is `train`. + Also note that when the load model failed, it will `fit` model. + .. note:: + + if users choose `mode` test, they need to make sure: + - The loader of `test_start_date` must be less than or equal to the current `test_start_date`. + - If other parameters of the `loader` model args are different, a warning will appear. + + +- `loader` + If the `mode` is `test` or `finetune` is `true`, it will be used. + + - `model_index` + Model index, int type. The index of the loaded model in loader_models (starting at 0) for the first `finetune`. The default value is None. + + - `exp_info_path` + Loader model experiment info path, str type. If the field exists, the following parameters will be parsed from `exp_info_path`, and the following parameters will not work. This field and `id` must exist one. + + - `id` + The experiment id of the model that needs to be loaded, int type. If the `mode` is `test`, this value is required. This field and `exp_info_path` must exist one. + + - `name` + The experiment name of the model that needs to be loaded, str type. The default value is the current experiment `name`. + + - `observer_type` + The experiment observer type of the model that needs to be loaded, str type. The default value is the current experiment `observer_type`. + .. note:: The observer type is a concept of the `sacred` module, which determines how files, standard input and output which are managed by sacred are stored. + + + - `file_storage` + If `observer_type` is `file_storage`, the config may be as follows. + + .. code-block:: YAML + + experiment: + name: test_experiment + dir: # default is dir of `config.yml` + observer_type: file_storage + - `mongo` + If `observer_type` is `mongo`, the config may be as follows. + + .. code-block:: YAML + + experiment: + name: test_experiment + observer_type: mongo + mongo_url: mongodb://MONGO_URL + db_name: public + + Users need to indicate `mongo_url` and `db_name` for a mongo observer. + + .. note:: + + If users choose mongo observer, they need to make sure: + - have an environment with the mongodb installed and a mongo database dedicated for storing the experiments results. + - The python environment(the version of python and package) to run the experiments and the one to fetch the results are consistent. + +Model Field +----------------- + +Users can use a specified model by configuration with hyper-parameters. + +Custom Models +~~~~~~~~~~~~~~~~~ + +Qlib support custom models, but it must be a subclass of the `qlib.contrib.model.Model`, the config for custom model may be as following. + +.. code-block:: YAML + + model: + class: SomeModel + module_path: /tmp/my_experment/custom_model.py + args: + loss: binary + + +The class `SomeModel` should be in the module `custom_model`, and ``Qlib`` could parse the `module_path` to load the class. + +To Know more about ``Model``, please refer to `Model `_. + +Data Field +----------------- + +``Data Handler`` can be used to load raw data, prepare features and label columns, preprocess data(standardization, remove NaN, etc.), split training, validation, and test sets. It is a subclass of `qlib.contrib.estimator.handler.BaseDataHandler`. + +Users can use the specified data handler by config as follows. + +.. code-block:: YAML + + data: + class: QLibDataHandlerClose + args: + start_date: 2005-01-01 + end_date: 2018-04-30 + dropna_label: True + filter: + market: csi500 + filter_pipeline: + - + class: NameDFilter + module_path: qlib.filter + args: + name_rule_re: S(?!Z3) + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + - + class: ExpressionDFilter + module_path: qlib.filter + args: + rule_expression: $open/$factor<=45 + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + +- `class` + Data handler class, str type, which should be a subclass of `qlib.contrib.estimator.handler.BaseDataHandler`, and implements 5 important interfaces for loading features, loading raw data, preprocessing raw data, slicing train, validation, and test data. The default value is `ALPHA360`. If users want to write a data handler to retrieve the data in qlib, `QlibDataHandler` is suggested. + +- `module_path` + The module path, str type, absolute url is also supported, indicates the path of the `class` implementation of data processor class. The default value is `qlib.contrib.estimator.handler`. + +- `args` + Parameters used for ``Data Handler`` initialization. + + - `train_start_date` + Training start time, str type, default value is `2005-01-01`. + + - `start_date` + Data start date, str type. + + - `end_date` + Data end date, str type. the data from start_date to end_date decides which part of data will be loaded in datahandler, users can only use these data in the following parts. + + - `dropna_feature` (Optional in args) + Drop Nan feature, bool type, default value is False. + + - `dropna_label` (Optional in args) + Drop Nan label, bool type, default value is True. Some multi-label tasks will use this. + + - `normalize_method` (Optional in args) + Normalzie data by given method. str type. ``Qlib`` give two normalize method, `MinMax` and `Std`. + If users wants to build their own method, please override `_process_normalize_feature`. + +- `filter` + Dynamically filtering the stocks based on the filter pipeline. + + - `market` + index name, str type, the default value is `csi500`. + + - `filter_pipeline` + Filter rule list, list type, the default value is []. Can be customized according to users' needs. + + - `class` + Filter class name, str type. + + - `module_path` + The module path, str type. + + - `args` + The filter class parameters, this parameters are set according to the `class`, and all the parameters as kwargs to `class`. + +Custom Data Handler +~~~~~~~~~~~~~~~~~~~~~~ + +Qlib support custom data handler, but it must be a subclass of the ``qlib.contrib.estimator.handler.BaseDataHandler``, the config for custom data handler may be as follows. + +.. code-block:: YAML + + data: + class: SomeDataHandler + module_path: /tmp/my_experment/custom_data_handler.py + args: + start_date: 2005-01-01 + end_date: 2018-04-30 + +The class `SomeDataHandler` should be in the module `custom_data_handler`, and ``Qlib`` could parse the `module_path` to load the class. + +If users want to load features and labels by config, they can inherit ``qlib.contrib.estimator.handler.ConfigDataHandler``, ``Qlib`` also has provided some preprocess method in this subclass. +If users want to use qlib data, `QLibDataHandler` is recommended, from which users can inherit custom class. `QLibDataHandler` is also a subclass of `ConfigDataHandler`. + +To Know more about ``Data Handler``, please refer to `Data Framework&Usage `_. + +Trainer Field +----------------- + +Users can specify the trainer ``Trainer`` by the config file, which is subclass of ``qlib.contrib.estimator.trainer.BaseTrainer`` and implement three important interfaces for training the model, restoring the model, and getting model predictions as follows. + +- `train` + Implement this interface to train the model. + +- `load` + Implement this interface to recover the model from disk. + +- `get_pred` + Implement this interface to get model prediction results. + +Qlib have provided two implemented trainer, + +- `StaticTrainer` + The static trainer will be trained using the training, validation, and test data of the data processor static slicing. + +- `RollingTrainer` + The rolling trainer will use the rolling iterator of the data processor to split data for rolling training. + + +Users can specify `trainer` with the configuration file: + +.. code-block:: YAML + + trainer: + class: StaticTrainer # or RollingTrainer + args: + rolling_period: 360 + train_start_date: 2005-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-06-30 + test_start_date: 2016-07-01 + test_end_date: 2017-07-31 + +- `class` + Trainer class, which should be a subclass of `qlib.contrib.estimator.trainer.BaseTrainer`, and needs to implement three important interfaces, the default value is `StaticTrainer`. + +- `module_path` + The module path, str type, absolute url is also supported, indicates the path of the trainer class implementation. + +- `args` + Parameters used for ``Trainer`` initialization. + + - `rolling_period` + The rolling period, integer type, indicates how many time steps need rolling when rolling the data. The default value is `60`. Only used in `RollingTrainer`. + + - `train_start_date` + Training start time, str type. + + - `train_end_date` + Training end time, str type. + + - `validate_start_date` + Validation start time, str type. + + - `validate_end_date` + Validation end time, str type. + + - `test_start_date` + Test start time, str type. + + - `test_end_date` + Test end time, str type. If `test_end_date` is `-1` or greater than the last date of the data, the last date of the data will be used as `test_end_date`. + +Custom Trainer +~~~~~~~~~~~~~~~~~~ + +Qlib support custom trainer, but it must be a subclass of the `qlib.contrib.estimator.trainer.BaseTrainer`, the config for custom trainer may be as following, + +.. code-block:: YAML + + trainer: + class: SomeTrainer + module_path: /tmp/my_experment/custom_trainer.py + args: + train_start_date: 2005-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-06-30 + test_start_date: 2016-07-01 + test_end_date: 2017-07-31 + + +The class `SomeTrainer` should be in the module `custom_trainer`, and ``Qlib`` could parse the `module_path` to load the class. + +Strategy Field +----------------- + +Users can specify strategy through a config file, for example: + +.. code-block:: YAML + + strategy : + class: TopkDropoutStrategy + args: + topk: 50 + n_drop: 5 + +- `class` + The strategy class, str type, should be a subclass of `qlib.contrib.strategy.strategy.BaseStrategy`. The default value is `TopkDropoutStrategy`. + +- `module_path` + The module location, str type, absolute url is also supported, and absolute path is also supported, indicates the location of the policy class implementation. + +- `args` + Parameters used for ``Trainer`` initialization. + + - `topk` + The number of stocks in the portfolio + + - `n_drop` + Number of stocks to be replaced in each trading date + +Custom Strategy +^^^^^^^^^^^^^^^^^^^ + +Qlib support custom strategy, but it must be a subclass of the ``qlib.contrib.strategy.strategy.BaseStrategy``, the config for custom strategy may be as following, + + +.. code-block:: YAML + + strategy : + class: SomeStrategy + module_path: /tmp/my_experment/custom_strategy.py + +The class `SomeStrategy` should be in the module `custom_strategy`, and ``Qlib`` could parse the `module_path` to load the class. + +To Know more about ``Strategy``, please refer to `Strategy `_. + +Backtest Field +----------------- + +Users can specify `backtest` through a config file, for example: + +.. code-block:: YAML + + backtest : + normal_backtest_args: + topk: 50 + benchmark: SH000905 + account: 500000 + deal_price: close + min_cost: 5 + subscribe_fields: + - $close + - $change + - $factor + +- `normal_backtest_args` + Normal backtest parameters. All the parameters in this section will be passed to the ``qlib.contrib.evaluate.backtest`` function in the form of `**kwargs`. + + - `benchmark` + Stock index symbol, str or list type, the default value is `None`. + + .. note:: + + * If `benchmark` is None, it will use the average change of the day of all stocks in 'pred' as the 'bench'. + + * If `benchmark` is list, it will use the daily average change of the stock pool in the list as the 'bench'. + + * If `benchmark` is str, it will use the daily change as the 'bench'. + + + - `account` + Backtest initial cash, integer type. The `account` in `strategy` section is deprecated. It only works when `account` is not set in `backtest` section. It will be overridden by `account` in the `backtest` section. The default value is 1e9. + + - `deal_price` + Order transaction price field, str type, the default value is vwap. + + - `min_cost` + Min transaction cost, float type, the default value is 5. + + - `subscribe_fields` + Subscribe quote fields, array type, the default value is [`deal_price`, $close, $change, $factor]. + + +Qlib Data Field +-------------------- + +The `qlib_data` field describes the parameters of qlib initialization. + +.. code-block:: YAML + + qlib_data: + # when testing, please modify the following parameters according to the specific environment + provider_uri: "~/.qlib/qlib_data/cn_data" + region: "cn" + +- `provider_uri` + The local directory where the data loaded by 'get_data.py' is stored. +- `region` + - If region == ``qlib.config.REG_CN``, 'qlib' will be initialized in US-stock mode. + - If region == ``qlib.config.REG_US``, 'qlib' will be initialized in china-stock mode. + +Please refer to `Initialization <../start/initialization.rst>`_. + +Experiment Result +=================== + +Form of Experimental Result +---------------------------- +The result of the experiment is the result of the backtest, please refer to `Backtest `_. + + +Get Experiment Result +---------------------------- + +Users can check the experiment results from file storage directly, or check the experiment results from database, or get the experiment results through two API of a module `fetcher` provided by ``Qlib``. + +- `get_experiments()` + The API takes two parameters. The first parameter is the experiment name. The default is all experiments. The second parameter is the observer type. Users can get the experiment name dictionary with a list of ids and test end date by the API as follows. + + .. code-block:: JSON + + { + "ex_a": [ + { + "id": 1, + "test_end_date": "2017-01-01" + } + ], + "ex_b": [ + ... + ] + } + + +- `get_experiment(exp_name, exp_id, fields=None)` + The API takes three parameters, the first parameter is the experiment name, the second parameter is the experiment id, and the third parameter is field list. + If fields is None, will get all fields. + + .. note:: + Currently supported fields: + ['model', 'analysis', 'positions', 'report_normal', 'pred', 'task_config', 'label'] + + .. code-block:: JSON + + { + 'analysis': analysis_df, + 'pred': pred_df, + 'positions': positions_dic, + 'report_normal': report_normal_df, + } + + +Here is a simple example of `FileFetcher`, which could fetch files from `file_storage` observer. + +.. code-block:: python + + >>> from qlib.contrib.estimator.fetcher import FileFetcher + >>> f = FileFetcher(experiments_dir=r'./') + >>> print(f.get_experiments()) + + { + 'test_experiment': [ + { + 'id': '1', + 'config': ... + }, + { + 'id': '2', + 'config': ... + }, + { + 'id': '3', + 'config': ... + } + ] + } + + + >>> print(f.get_experiment('test_experiment', '1')) + + risk + sub_bench mean 0.000662 + std 0.004487 + annual 0.166720 + sharpe 2.340526 + mdd -0.080516 + sub_cost mean 0.000577 + std 0.004482 + annual 0.145392 + sharpe 2.043494 + mdd -0.083584 + +If users use mongo observer when training, they should initialize their fether with mongo_url + +.. code-block:: python + + >>> from qlib.contrib.estimator.fetcher import MongoFetcher + >>> f = MongoFetcher(mongo_url=..., db_name=...) + diff --git a/docs/component/model.rst b/docs/component/model.rst new file mode 100644 index 000000000..e4db517a5 --- /dev/null +++ b/docs/component/model.rst @@ -0,0 +1,179 @@ +.. _model: +============================================ +Interday Model: Model Training & Prediction +============================================ + +Introduction +=================== + +``Interday Model`` is designed to make the prediction score about stocks. Users can use the ``Interday Model`` in an automatic workflow by ``Estimator``, please refer to `Estimator `_. + +Because the components in ``Qlib`` are designed in a loosely-coupled way, ``Interday Model`` can be used as a independent module also. + +Base Class & Interface +====================== + +``Qlib`` provides a base class `qlib.contrib.model.base.Model <../reference/api.html#module-qlib.contrib.model.base>`_, which all models should inherit from. + +The base class provides the following interfaces: + +- `__init__(**kwargs)` + - Initialization. + - If users use ``Estimator`` to start an `experiment`, the parameter of `__init__` method shoule be consistent with the hyperparameters in the configuration file. + +- `fit(self, x_train, y_train, x_valid, y_valid, w_train=None, w_valid=None, **kwargs)` + - Train model. + - Parameter: + - `x_train`, pd.DataFrame type, train feature + The following example explains the value of `x_train`: + + .. code-block:: YAML + + KMID KLEN KMID2 KUP KUP2 + instrument datetime + SH600004 2012-01-04 0.000000 0.017685 0.000000 0.012862 0.727275 + 2012-01-05 -0.006473 0.025890 -0.250001 0.012945 0.499998 + 2012-01-06 0.008117 0.019481 0.416666 0.008117 0.416666 + 2012-01-09 0.016051 0.025682 0.624998 0.006421 0.250001 + 2012-01-10 0.017323 0.026772 0.647057 0.003150 0.117648 + ... ... ... ... ... ... + SZ300273 2014-12-25 -0.005295 0.038697 -0.136843 0.016293 0.421052 + 2014-12-26 -0.022486 0.041701 -0.539215 0.002453 0.058824 + 2014-12-29 -0.031526 0.039092 -0.806451 0.000000 0.000000 + 2014-12-30 -0.010000 0.032174 -0.310811 0.013913 0.432433 + 2014-12-31 0.010917 0.020087 0.543479 0.001310 0.065216 + + + `x_train` is a pandas DataFrame, whose index is MultiIndex . Each column of `x_train` corresponds to a feature, and the column name is the feature name. + + .. note:: + + The number and names of the columns is determined by the data handler, please refer to `Data Handler `_ and `Estimator Data `_. + + - `y_train`, pd.DataFrame type, train label + The following example explains the value of `y_train`: + + .. code-block:: YAML + + LABEL + instrument datetime + SH600004 2012-01-04 -0.798456 + 2012-01-05 -1.366716 + 2012-01-06 -0.491026 + 2012-01-09 0.296900 + 2012-01-10 0.501426 + ... ... + SZ300273 2014-12-25 -0.465540 + 2014-12-26 0.233864 + 2014-12-29 0.471368 + 2014-12-30 0.411914 + 2014-12-31 1.342723 + + `y_train` is a pandas DataFrame, whose index is MultiIndex . The `LABEL` column represents the value of train label. + + .. note:: + + The number and names of the columns is determined by the ``Data Handler``, please refer to `Data Handler `_. + + - `x_valid`, pd.DataFrame type, validation feature + The format of `x_valid` is same as `x_train` + + + - `y_valid`, pd.DataFrame type, validation label + The format of `y_valid` is same as `y_train` + + - `w_train`(Optional args, default is None), pd.DataFrame type, train weight + `w_train` is a pandas DataFrame, whose shape and index is same as `x_train`. The float value in `w_train` represents the weight of the feature at the same position in `x_train`. + + - `w_train`(Optional args, default is None), pd.DataFrame type, validation weight + `w_train` is a pandas DataFrame, whose shape and index is same as `x_valid`. The float value in `w_train` represents the weight of the feature at the same position in `x_train`. + +- `predict(self, x_test, **kwargs)` + - Predict test data 'x_test' + - Parameter: + - `x_test`, pd.DataFrame type, test features + The form of `x_test` is same as `x_train` in 'fit' method. + - Return: + - `label`, np.ndarray type, test label + The label of `x_test` that predicted by model. + +- `score(self, x_test, y_test, w_test=None, **kwargs)` + - Evaluate model with test feature/label + - Parameter: + - `x_test`, pd.DataFrame type, test feature + The format of `x_test` is same as `x_train` in `fit` method. + + - `x_test`, pd.DataFrame type, test label + The format of `y_test` is same as `y_train` in `fit` method. + + - `w_test`, pd.DataFrame type, test weight + The format of `w_test` is same as `w_train` in `fit` method. + - Return: float type, evaluation score + +For other interfaces such as `save`, `load`, `finetune`, please refer to `Model API <../reference/api.html#module-qlib.contrib.model.base>`_. + +Example +================== + +``Qlib`` provides ``LightGBM`` and ``DNN`` models as the baseline, the following steps shows how to run`` LightGBM`` as an independent module. + +- Initialize ``Qlib`` with `qlib.init` first, please refer to `initialization `_. +- Run the following code to get the prediction score `pred_score` + .. code-block:: Python + + from qlib.contrib.estimator.handler import QLibDataHandlerClose + from qlib.contrib.model.gbdt import LGBModel + + DATA_HANDLER_CONFIG = { + "dropna_label": True, + "start_date": "2007-01-01", + "end_date": "2020-08-01", + "market": MARKET, + } + + TRAINER_CONFIG = { + "train_start_date": "2007-01-01", + "train_end_date": "2014-12-31", + "validate_start_date": "2015-01-01", + "validate_end_date": "2016-12-31", + "test_start_date": "2017-01-01", + "test_end_date": "2020-08-01", + } + + x_train, y_train, x_validate, y_validate, x_test, y_test = QLibDataHandlerClose( + **DATA_HANDLER_CONFIG + ).get_split_data(**TRAINER_CONFIG) + + + MODEL_CONFIG = { + "loss": "mse", + "colsample_bytree": 0.8879, + "learning_rate": 0.0421, + "subsample": 0.8789, + "lambda_l1": 205.6999, + "lambda_l2": 580.9768, + "max_depth": 8, + "num_leaves": 210, + "num_threads": 20, + } + # use default model + # custom Model, refer to: TODO: Model API url + model = LGBModel(**MODEL_CONFIG) + model.fit(x_train, y_train, x_validate, y_validate) + _pred = model.predict(x_test) + pred_score = pd.DataFrame(index=_pred.index) + pred_score["score"] = _pred.iloc(axis=1)[0] + + .. note:: `QLibDataHandlerClose` is the data handler provided by ``Qlib``, please refer to `Data Handler `_. + +Also, the above example has been given in ``examples/train_backtest_analyze.ipynb``. + +Custom Model +=================== + +Qlib supports custom models. If users are interested in customizing their own models and integrating the models into ``Qlib``, please refer to `Custom Model Integration <../start/integration.html>`_. + + +API +=================== +Please refer to `Model API <../reference/api.html#module-qlib.contrib.model.base>`_. diff --git a/docs/component/report.rst b/docs/component/report.rst new file mode 100644 index 000000000..6e9933d69 --- /dev/null +++ b/docs/component/report.rst @@ -0,0 +1,197 @@ +.. _report: +========================================== +Aanalysis: Evaluation & Results Analysis +========================================== + +Introduction +=================== + +``Aanalysis`` is designed to show the graphical reports of ``Intraday Trading`` , which helps users to evaluate and analyse investment portfolios visually. There are the following graphics to view: + +- analysis_position + - report_graph + - score_ic_graph + - cumulative_return_graph + - risk_analysis_graph + - rank_label_graph + +- analysis_model + - model_performance_graph + + +Graphical Reports +=================== + +Users can run the following code to get all supported reports. + +.. code-block:: python + + >>> import qlib.contrib.report as qcr + >>> print(qcr.GRAPH_NAME_LISt) + ['analysis_position.report_graph', 'analysis_position.score_ic_graph', 'analysis_position.cumulative_return_graph', 'analysis_position.risk_analysis_graph', 'analysis_position.rank_label_graph', 'analysis_model.model_performance_graph'] + +.. note:: + + For more details, please refer to the function document: similar to ``help(qcr.analysis_position.report_graph)`` + + + +Usage&Example +=================== + +Usage of `analysis_position.report` +----------------------------------- + +API +~~~~~~~~~~~~~~~~ + +.. automodule:: qlib.contrib.report.analysis_position.report + :members: + +Graphical Result +~~~~~~~~~~~~~~~~ + +.. note:: + + - Axis X: Trading day + - Axis Y: Accumulated value + - The shaded part above: Maximum drawdown corresponding to `cum return` + - The shaded part below: Maximum drawdown corresponding to `cum ex return wo cost` % + +.. image:: ../_static/img/analysis/report.png + + +Usage of `analysis_position.score_ic` +------------------------------------- + +API +~~~~~~~~~~~~~~~~ + +.. automodule:: qlib.contrib.report.analysis_position.score_ic + :members: + + +Graphical Result +~~~~~~~~~~~~~~~~~ + +.. note:: + + - Axis X: Trading day + - Axis Y: `Ref($close, -1)/$close - 1` and `score` IC% + +.. image:: ../_static/img/analysis/score_ic.png + + +Usage of `analysis_position.cumulative_return` +---------------------------------------------- + +API +~~~~~~~~~~~~~~~~ + +.. automodule:: qlib.contrib.report.analysis_position.cumulative_return + :members: + +Graphical Result +~~~~~~~~~~~~~~~~~ + +.. note:: + + - Cumulative return graphics. + - Axis X: Trading day + - Axis Y: + - Above axis Y: `(((Ref($close, -1)/$close - 1) * weight).sum() / weight.sum()).cumsum()` + - Below axis Y: Daily weight sum + - In the **sell** graph, `y < 0` stands for profit; in other cases, `y > 0` stands for profit. + - In the **buy_minus_sell** graph, the **y** value of the **weight** graph at the bottom is `buy_weight + sell_weight`. + - In each graph, the **red line** in the histogram on the right represents the average.% + +.. image:: ../_static/img/analysis/cumulative_return_buy.png + +.. image:: ../_static/img/analysis/cumulative_return_sell.png + +.. image:: ../_static/img/analysis/cumulative_return_buy_minus_sell.png + +.. image:: ../_static/img/analysis/cumulative_return_hold.png + + +Usage of `analysis_position.risk_analysis` +---------------------------------------------- + +API +~~~~~~~~~~~~~~~~ + +.. automodule:: qlib.contrib.report.analysis_position.risk_analysis + :members: + + +.. note:: + + - annual/mdd/sharpe/std graphics + - Axis X: Trading days are grouped by month + - Axis Y: monthly(trading date) value + +Graphical Result +~~~~~~~~~~~~~~~~~ + +.. image:: ../_static/img/analysis/risk_analysis_bar.png + +.. image:: ../_static/img/analysis/risk_analysis_annual.png + +.. image:: ../_static/img/analysis/risk_analysis_mdd.png + +.. image:: ../_static/img/analysis/risk_analysis_sharpe.png + +.. image:: ../_static/img/analysis/risk_analysis_std.png + + +Usage of `analysis_position.rank_label` +---------------------------------------------- + +API +~~~~~ + +.. automodule:: qlib.contrib.report.analysis_position.rank_label + :members: + + +Graphical Result +~~~~~~~~~~~~~~~~~ + +.. note:: + + - hold/sell/buy graphics: + - Axis X: Trading day + - Axis Y: Percentage of `'Ref($close, -1)/$close - 1'.rank(ascending=False) / (number of lines on the day) * 100` every trading day. (`ascending=False`: The higher the value, the higher the ranking)% + +.. image:: ../_static/img/analysis/rank_label_hold.png + +.. image:: ../_static/img/analysis/rank_label_buy.png + +.. image:: ../_static/img/analysis/rank_label_sell.png + + + +Usage of `analysis_model.analysis_model_performance` +----------------------------------------------------- + +API +~~~~~ + +.. automodule:: qlib.contrib.report.analysis_model.analysis_model_performance + :members: + + +Graphical Result +~~~~~~~~~~~~~~~~~ + +.. image:: ../_static/img/analysis/analysis_model_cumulative_return.png + +.. image:: ../_static/img/analysis/analysis_model_long_short.png + +.. image:: ../_static/img/analysis/analysis_model_IC.png + +.. image:: ../_static/img/analysis/analysis_model_monthly_IC.png + +.. image:: ../_static/img/analysis/analysis_model_NDQ.png + +.. image:: ../_static/img/analysis/analysis_model_auto_correlation.png \ No newline at end of file diff --git a/docs/component/strategy.rst b/docs/component/strategy.rst new file mode 100644 index 000000000..10ee714e6 --- /dev/null +++ b/docs/component/strategy.rst @@ -0,0 +1,119 @@ +.. _strategy: +======================================== +Interday Strategy: Portfolio Management +======================================== +.. currentmodule:: qlib + +Introduction +=================== + +``Interday Strategy`` is designed to adopt different trading strategies, which means that users can adopt different algorithms to generate investment portfolios based on the prediction scores of the ``Interday Model``. Users can use the ``Interday Strategy`` in an automatic workflow by ``Estimator``, please refer to `Estimator `_. + +Because the componets in ``Qlib`` are designed in a loosely-coupled way, ``Interday Strategy`` can be used as a independent module also. + +``Qlib`` provides several implemented trading strategy. Also, ``Qlib`` supports costom strategy, users can customize strategies according to their own needs. + +Base Class & Interface +====================== + +BaseStrategy +------------------ + +Qlib provides a base class ``qlib.contrib.strategy.BaseStrategy``. All strategy classes need to inherit the base class and implement its interface. + +- `get_risk_degree` + Return the proportion of your total value you will use in investment. Dynamically risk_degree will result in Market timing. + +- `generate_order_list` + Rerturn the order list. + +User can inherit `BaseStrategy` to costomize their strategy class. + +WeightStrategyBase +-------------------- + +Qlib alse provides a class ``qlib.contrib.strategy.WeightStrategyBase`` that is a subclass of `BaseStrategy`. + +`WeightStrategyBase` only focuses on the target positions, and automatically generates an order list based on positions. It provides the `generate_target_weight_position` interface. + +- `generate_target_weight_position` + - According to the current position and trading date to generate the target position. The cash is not considered. + - Return the target position. + + .. note:: + Here the `target position` means the target percentage of total assets. + +`WeightStrategyBase` implements the interface `generate_order_list`, whose processions is as follows. + +- Call `generate_target_weight_position` method to generate the target position. +- Generate the target amount of stocks from the target position. +- Generate the order list from the target amount + +Users can inherit `WeightStrategyBase` and implement the inteface `generate_target_weight_position` to costomize their strategy class, which only focuses on the target positions. + +Implemented Strategy +==================== + +Qlib provides several implemented strategy classes `TopkDropoutStrategy`. + + +TopkDropoutStrategy +------------------ +`TopkDropoutStrategy` is a subclass of `BaseStrategy` and implement the interface `generate_order_list` whose process is as follows. + +- Adopt the the ``Topk-Drop`` algorithm to calculate the target amount of each stock + + .. note:: + ``Topk-Drop`` algorithm: + + - `Topk`: The number of stocks held + - `Drop`: The number of stocks sold on each trading day + + Currently, the number of held stocks is `Topk`. + On each trading day, the `Drop` number of held stocks with worst prediction score will be sold, and the same number of unheld stocks with best prediction score will be bought. + + .. image:: ../_static/img/topk_drop.png + :alt: Topk-Drop + + ``TopkDrop`` algorithm sells `Drop` stocks every trading day, which guarantees a fixed turnover rate. + +- Generate the order list from the target amount + +Usage & Example +==================== +``Interday Strategy`` can be specified in the ``Intraday Trading(Backtest)``, the example is as follows. + +.. code-block:: python + + from qlib.contrib.strategy.strategy import TopkDropoutStrategy + from qlib.contrib.evaluate import backtest + STRATEGY_CONFIG = { + "topk": 50, + "n_drop": 5, + } + BACKTEST_CONFIG = { + "verbose": False, + "limit_threshold": 0.095, + "account": 100000000, + "benchmark": BENCHMARK, + "deal_price": "vwap", + } + + # use default strategy + # custom Strategy, refer to: TODO: Strategy API url + strategy = TopkDropoutStrategy(**STRATEGY_CONFIG) + + # pred_score is the prediction score output by Model + report_normal, positions_normal = backtest( + pred_score, strategy=strategy, **BACKTEST_CONFIG + ) + +Also, the above example has been given in ``examples\train_backtest_analyze.ipynb``. + +To know more about the prediction score `pred_score` output by ``Interday Model``, please refer to `Interday Model: Model Training & Prediction `_. + +To know more about ``Intraday Trading``, please refer to `Intraday Trading: Model&Strategy Testing `_. + +Reference +=================== +TO konw more about ``Interday Strategy``, please refer to `Strategy API <../reference/api.html>`_. diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..0e815d7e0 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,224 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +# QLib documentation build configuration file, created by +# sphinx-quickstart on Wed Sep 27 15:16:05 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +import pkg_resources + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.todo', + 'sphinx.ext.mathjax', + 'sphinx.ext.napoleon', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u"QLib" +copyright = u"Microsoft" +author = u"Microsoft" + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = pkg_resources.get_distribution("qlib").version +# The full version, including alpha/beta/rc tags. +release = pkg_resources.get_distribution("qlib").version + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'en_US' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + +# If true, '()' will be appended to :func: etc. cross-reference text. +add_function_parentheses = False + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = True + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# html_context = { +# "display_github": False, +# "last_updated": True, +# "commit": True, +# "github_user": "Microsoft", +# "github_repo": "QLib", +# 'github_version': 'master', +# 'conf_py_path': '/docs/', + +# } +# +html_theme_options = { + 'collapse_navigation': False, + 'display_version': False, + 'navigation_depth': 3, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +#html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'qlibdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, "qlib.tex", u"QLib Documentation", u"Microsoft", "manual"), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'qlib', u'QLib Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'QLib', u'QLib Documentation', + author, 'QLib', 'One line description of project.', + 'Miscellaneous'), +] + + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +autodoc_member_order = 'bysource' +autodoc_default_flags = ['members'] diff --git a/docs/hidden/client.rst b/docs/hidden/client.rst new file mode 100644 index 000000000..242c1afc2 --- /dev/null +++ b/docs/hidden/client.rst @@ -0,0 +1,171 @@ +.. _client: + +Qlib Client-Server Framework +=================== + +.. currentmodule:: qlib + +Introduction +----------- +Client-Server is designed to solve following problems + +- Manage the data in a centralized way. Users don't have to manage data of different versions. +- Reduce the amount of cache to be generated. +- Make the data can be accessed in a remote way. + +Therefore, we designed the client-server framework to solve these problems. +We will maintain a server and provide the data. + +You have to initialize you qlib with specific config for using the client-server framework. +Here is a typical initialization process. + +qlib ``init`` commonly used parameters; ``nfs-common`` must be installed on the server where the client is located, execute: ``sudo apt install nfs-common``: + - ``provider_uri``: nfs-server path; the format is ``host: data_dir``, for example: ``172.23.233.89:/data2/gaochao/sync_qlib/qlib``. If using offline, it can be a local data directory + - ``mount_path``: local data directory, ``provider_uri`` will be mounted to this directory + - ``auto_mount``: whether to automatically mount ``provider_uri`` to ``mount_path`` during qlib ``init``; You can also mount it manually: sudo mount.nfs ``provider_uri`` ``mount_path``. If on PAI, it is recommended to set ``auto_mount=True`` + - ``flask_server``: data service host; if you are on the intranet, you can use the default host: 172.23.233.89 + - ``flask_port``: data service port + + +If running on 10.150.144.153 or 10.150.144.154 server, it's recommended to use the following code to ``init`` qlib: + +.. code-block:: python + + >>> import qlib + >>> qlib.init(auto_mount=False, mount_path='/data/csdesign/qlib') + >>> from qlib.data import D + >>> D.features(['SH600000'], ['$close'], start_time='20080101', end_time='20090101').head() + [39336:MainThread](2019-05-28 21:35:42,800) INFO - Initialization - [__init__.py:16] - default_conf: client. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:54] - qlib successfully initialized based on client settings. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:56] - provider_uri=172.23.233.89:/data2/gaochao/sync_qlib/qlib + [39336:Thread-68](2019-05-28 21:35:42,809) INFO - Client - [client.py:28] - Connect to server ws://172.23.233.89:9710 + [39336:Thread-72](2019-05-28 21:35:43,489) INFO - Client - [client.py:31] - Disconnect from server! + Opening /data/csdesign/qlib/cache/d239a3b191daa9a5b1b19a59beb47b33 in read-only mode + Out[5]: + $close + instrument datetime + SH600000 2008-01-02 119.079704 + 2008-01-03 113.120125 + 2008-01-04 117.878860 + 2008-01-07 124.505539 + 2008-01-08 125.395004 + + +If running on PAI, it's recommended to use the following code to ``init`` qlib: + +.. code-block:: python + + >>> import qlib + >>> qlib.init(auto_mount=True, mount_path='/data/csdesign/qlib', provider_uri='172.23.233.89:/data2/gaochao/sync_qlib/qlib') + >>> from qlib.data import D + >>> D.features(['SH600000'], ['$close'], start_time='20080101', end_time='20090101').head() + [39336:MainThread](2019-05-28 21:35:42,800) INFO - Initialization - [__init__.py:16] - default_conf: client. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:54] - qlib successfully initialized based on client settings. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:56] - provider_uri=172.23.233.89:/data2/gaochao/sync_qlib/qlib + [39336:Thread-68](2019-05-28 21:35:42,809) INFO - Client - [client.py:28] - Connect to server ws://172.23.233.89:9710 + [39336:Thread-72](2019-05-28 21:35:43,489) INFO - Client - [client.py:31] - Disconnect from server! + Opening /data/csdesign/qlib/cache/d239a3b191daa9a5b1b19a59beb47b33 in read-only mode + Out[5]: + $close + instrument datetime + SH600000 2008-01-02 119.079704 + 2008-01-03 113.120125 + 2008-01-04 117.878860 + 2008-01-07 124.505539 + 2008-01-08 125.395004 + + +If running on Windows, open **NFS** features and write correct **mount_path**, it's recommended to use the following code to ``init`` qlib: + +1.windows System open NFS Features + * Open ``Programs and Features``. + * Click ``Turn Windows features on or off``. + * Scroll down and check the option ``Services for NFS``, then click OK + Reference address: https://graspingtech.com/mount-nfs-share-windows-10/ +2.config correct mount_path + * In windows, mount path must be not exist path and root path, + * correct format path eg: `H`, `i`... + * error format path eg: `C`, `C:/user/name`, `qlib_data`... + +.. code-block:: python + + >>> import qlib + >>> qlib.init(auto_mount=True, mount_path='H', provider_uri='172.23.233.89:/data2/gaochao/sync_qlib/qlib') + >>> from qlib.data import D + >>> D.features(['SH600000'], ['$close'], start_time='20080101', end_time='20090101').head() + [39336:MainThread](2019-05-28 21:35:42,800) INFO - Initialization - [__init__.py:16] - default_conf: client. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:54] - qlib successfully initialized based on client settings. + [39336:MainThread](2019-05-28 21:35:42,801) INFO - Initialization - [__init__.py:56] - provider_uri=172.23.233.89:/data2/gaochao/sync_qlib/qlib + [39336:Thread-68](2019-05-28 21:35:42,809) INFO - Client - [client.py:28] - Connect to server ws://172.23.233.89:9710 + [39336:Thread-72](2019-05-28 21:35:43,489) INFO - Client - [client.py:31] - Disconnect from server! + Opening /data/csdesign/qlib/cache/d239a3b191daa9a5b1b19a59beb47b33 in read-only mode + Out[5]: + $close + instrument datetime + SH600000 2008-01-02 119.079704 + 2008-01-03 113.120125 + 2008-01-04 117.878860 + 2008-01-07 124.505539 + 2008-01-08 125.395004 + + + + + +The client will mount the data in `provider_uri` on `mount_path`. Then the server and client will communicate with flask and transporting data with this NFS. + + +If you have a local qlib data files and want to use the qlib data offline instead of online with client server framework. +It is also possible with specific config. +You can created such a config. `client_config_local.yml` + +.. code-block:: YAML + + provider_uri: /data/csdesign/qlib + calendar_provider: 'LocalCalendarProvider' + instrument_provider: 'LocalInstrumentProvider' + feature_provider: 'LocalFeatureProvider' + expression_provider: 'LocalExpressionProvider' + dataset_provider: 'LocalDatasetProvider' + provider: 'LocalProvider' + dataset_cache: 'SimpleDatasetCache' + local_cache_path: '~/.cache/qlib/' + +`provider_uri` is the directory of your local data. + +.. code-block:: python + + >>> import qlib + >>> qlib.init_from_yaml_conf('client_config_local.yml') + >>> from qlib.data import D + >>> D.features(['SH600001'], ['$close'], start_time='20180101', end_time='20190101').head() + 21232:MainThread](2019-05-29 10:16:05,066) INFO - Initialization - [__init__.py:16] - default_conf: client. + [21232:MainThread](2019-05-29 10:16:05,066) INFO - Initialization - [__init__.py:54] - qlib successfully initialized based on client settings. + [21232:MainThread](2019-05-29 10:16:05,067) INFO - Initialization - [__init__.py:56] - provider_uri=/data/csdesign/qlib + Out[9]: + $close + instrument datetime + SH600001 2008-01-02 21.082111 + 2008-01-03 23.195362 + 2008-01-04 23.874615 + 2008-01-07 24.880930 + 2008-01-08 24.277143 + +Limitations +----------- +1. The following API under the client-server module may not be as fast as the older off-line API. + - Cal.calendar + - Inst.list_instruments +2. The rolling operation expression with parameter `0` can not be updated rightly under mechanism of the client-server framework. + +API +******************** + +The client is based on `python-socketio`_ which is a framework that supports WebSocket client for Python language. The client can only propose requests and receive results, which do not include any calculating procedure. + +Class +-------------------- + +.. automodule:: qlib.data.client + + diff --git a/docs/hidden/online.rst b/docs/hidden/online.rst new file mode 100644 index 000000000..c9c8e58f1 --- /dev/null +++ b/docs/hidden/online.rst @@ -0,0 +1,285 @@ +.. _online: + +Online +=================== +.. currentmodule:: qlib + +Introduction +------------------- + +Welcome to use Online, this module simulates what will be like if we do the real trading use our model and strategy. + +Just like Estimator and other modules in Qlib, you need to determine parameters through the configuration file, +and in this module, you need to add an account in a folder to do the simulation. Then in each coming day, +this module will use the newest information to do the trade for your account, +the performance can be viewed at any time using the API we defined. + +Each account will experience the following processes, the ‘pred_date’ represents the date you predict the target +positions after trading, also, the ‘trade_date’ is the date you do the trading. + +- Generate the order list (pre_date) +- Execute the order list (trade_date) +- Update account (trade_date) + +In the meantime, you can just create an account and use this module to test its performance in a period. + +- Simulate (start_date, end_date) + +This module need to save your account in a folder, the model and strategy will be saved as pickle files, +and the position and report will be saved as excel. +The file structure can be viewed at fileStruct_. + + +Example +------------------- + +Let's take an example, + +.. note:: Make sure you have the latest version of `qlib` installed. + +If you want to use the models and data provided by `qlib`, you only need to do as follows. + +Firstly, write a simple configuration file as following, + +.. code-block:: YAML + + strategy: + class: TopkAmountStrategy + module_path: qlib.contrib.strategy + args: + market: csi500 + trade_freq: 5 + + model: + class: ScoreFileModel + module_path: qlib.contrib.online.online_model + args: + loss: mse + model_path: ./model.bin + + init_cash: 1000000000 + +We then can use this command to create a folder and do trading from 2017-01-01 to 2018-08-01. + +.. code-block:: bash + + online simulate -id v-test -config ./config/config.yaml -exchange_config ./config/exchange.yaml -start 2017-01-01 -end 2018-08-01 -path ./user_data/ + +The start date (2017-01-01) is the add date of the user, which also is the first predict date, +and the end date (2018-08-01) is the last trade date. You can use "`online generate -date 2018-08-02...`" +command to continue generate the order_list at next trading date. + +If Your account was saved in "./user_data/", you can see the performance of your account compared to a benchmark by + +.. code-block:: bash + + >> online show -id v-test -path ./user_data/ -bench SH000905 + + ... + Result of porfolio: + sub_bench: + risk + mean 0.001157 + std 0.003039 + annual 0.289131 + sharpe 6.017635 + mdd -0.013185 + sub_cost: + risk + mean 0.000800 + std 0.003043 + annual 0.199944 + sharpe 4.155963 + mdd -0.015517 + +Here 'SH000905' represents csi500 and 'SH000300' represents csi300 + +Manage your account +-------------------- + +Any account processed by `online` should be saved in a folder. you can use commands +defined to manage your accounts. + +- add an new account + This will add an new account with user_id='v-test', add_date='2019-10-15' in ./user_data. + + .. code-block:: bash + + >> online add_user -id {user_id} -config {config_file} -path {folder_path} -date {add_date} + >> online add_user -id v-test -config config.yaml -path ./user_data/ -date 2019-10-15 + +- remove an account + .. code-block:: bash + + >> online remove_user -id {user_id} -path {folder_path} + >> online remove_user -id v-test -path ./user_data/ + +- show the performance + Here benchmark indicates the baseline is to be compared with yours. + + .. code-block:: bash + + >> online show -id {user_id} -path {folder_path} -bench {benchmark} + >> online show -id v-test -path ./user_data/ -bench SH000905 + +The default value of all the parameter 'date' below is trade date +(will be today if today is trading date and information has been updated in `qlib`). + +The 'generate' and 'update' will check whether input date is valid, the following 3 processes should +be called at each trading date. + +- generate the order list + generate the order list at trade date, and save them in {folder_path}/{user_id}/temp/ as a json file. + + .. code-block:: bash + + >> online generate -date {date} -path {folder_path} + >> online generate -date 2019-10-16 -path ./user_data/ + +- execute the order list + execute the order list and generate the transactions result in {folder_path}/{user_id}/temp/ at trade date + + .. code-block:: bash + + >> online execute -date {date} -exchange_config {exchange_config_path} -path {folder_path} + >> online execute -date 2019-10-16 -exchange_config ./config/exchange.yaml -path ./user_data/ + + A simple exchange config file can be as + + .. code-block:: yaml + + open_cost: 0.003 + close_cost: 0.003 + limit_threshold: 0.095 + deal_price: vwap + + +- update accounts + update accounts in "{folder_path}/" at trade date + + .. code-block:: bash + + >> online update -date {date} -path {folder_path} + >> online update -date 2019-10-16 -path ./user_data/ + +API +------------------ + +All those operations are based on defined in `qlib.contrib.online.operator` + +.. automodule:: qlib.contrib.online.operator + +.. _fileStruct: + +File structure +------------------ + +'user_data' indicates the root of folder. +Name that bold indicates it’s a folder, otherwise it’s a document. + +.. code-block:: yaml + + {user_folder} + │ users.csv: (Init date for each users) + │ + └───{user_id1}: (users' sub-folder to save their data) + │ │ position.xlsx + │ │ report.csv + │ │ model_{user_id1}.pickle + │ │ strategy_{user_id1}.pickle + │ │ + │ └───score + │ │ └───{YYYY} + │ │ └───{MM} + │ │ │ score_{YYYY-MM-DD}.csv + │ │ + │ └───trade + │ └───{YYYY} + │ └───{MM} + │ │ orderlist_{YYYY-MM-DD}.json + │ │ transaction_{YYYY-MM-DD}.csv + │ + └───{user_id2} + │ │ position.xlsx + │ │ report.csv + │ │ model_{user_id2}.pickle + │ │ strategy_{user_id2}.pickle + │ │ + │ └───score + │ └───trade + .... + + +Configuration file +------------------ + +The configure file used in `online` should contain the model and strategy information. + +About the model +~~~~~~~~~~~~~~~~~~~~ + +First, your configuration file needs to have a field about the model, +this field and its contents determine the model we used when generating score at predict date. + +Followings are two examples for ScoreFileModel and a model that read a score file and return score at trade date. + +.. code-block:: YAML + + model: + class: ScoreFileModel + module_path: qlib.contrib.online.OnlineModel + args: + loss: mse + +.. code-block:: YAML + + model: + class: ScoreFileModel + module_path: qlib.contrib.online.OnlineModel + args: + score_path: + +If your model doesn't belong to above models, you need to coding your model manually. +Your model should be a subclass of models defined in 'qlib.contfib.model'. And it must +contains 2 methods used in `online` module. + + +About the strategy +~~~~~~~~~~~~~~~~~~~~ + +Your need define the strategy used to generate the order list at predict date. + +Followings are two examples for a TopkAmountStrategy + +.. code-block:: YAML + + strategy: + class: TopkDropoutStrategy + module_path: qlib.contrib.strategy.strategy + args: + topk: 100 + n_drop: 10 + +Generated files +------------------ + +The 'online_generate' command will create the order list at {folder_path}/{user_id}/temp/, +the name of that is orderlist_{YYYY-MM-DD}.json, YYYY-MM-DD is the date that those orders to be executed. + +The format of json file is like + +.. code-block:: python + + { + 'sell': { + {'$stock_id1': '$amount1'}, + {'$stock_id2': '$amount2'}, ... + }, + 'buy': { + {'$stock_id1': '$amount1'}, + {'$stock_id2': '$amount2'}, ... + } + } + +Then after executing the order list (either by 'online_execute' or other executors), a transaction file +will be created also at {folder_path}/{user_id}/temp/. diff --git a/docs/hidden/tuner.rst b/docs/hidden/tuner.rst new file mode 100644 index 000000000..35d606c9c --- /dev/null +++ b/docs/hidden/tuner.rst @@ -0,0 +1,327 @@ +.. _tuner: + +Tuner +=================== +.. currentmodule:: qlib + +Introduction +------------------- + +Welcome to use Tuner, this document is based on that you can use Estimator proficiently and correctly. + +You can find the optimal hyper-parameters and combinations of models, trainers, strategies and data labels. + +The usage of program `tuner` is similar with `estimator`, you need provide the URL of the configuration file. +The `tuner` will do the following things: + +- Construct tuner pipeline +- Search and save best hyper-parameters of one tuner +- Search next tuner in pipeline +- Save the global best hyper-parameters and combination + +Each tuner is consisted with a kind of combination of modules, and its goal is searching the optimal hyper-parameters of this combination. +The pipeline is consisted with different tuners, it is aim at finding the optimal combination of modules. + +The result will be printed on screen and saved in file, you can check the result in your experiment saving files. + +Example +~~~~~~~ + +Let's see an example, + +First make sure you have the latest version of `qlib` installed. + +Then, you need to privide a configuration to setup the experiment. +We write a simple configuration example as following, + +.. code-block:: YAML + + experiment: + name: tuner_experiment + tuner_class: QLibTuner + qlib_client: + auto_mount: False + logging_level: INFO + optimization_criteria: + report_type: model + report_factor: model_score + optim_type: max + tuner_pipeline: + - + model: + class: SomeModel + space: SomeModelSpace + trainer: + class: RollingTrainer + strategy: + class: TopkAmountStrategy + space: TopkAmountStrategySpace + max_evals: 2 + + time_period: + rolling_period: 360 + train_start_date: 2005-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-06-30 + test_start_date: 2016-07-01 + test_end_date: 2018-04-30 + data: + class: ALPHA360 + provider_uri: /data/qlib + args: + start_date: 2005-01-01 + end_date: 2018-04-30 + dropna_label: True + dropna_feature: True + filter: + market: csi500 + filter_pipeline: + - + class: NameDFilter + module_path: qlib.data.filter + args: + name_rule_re: S(?!Z3) + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + - + class: ExpressionDFilter + module_path: qlib.data.filter + args: + rule_expression: $open/$factor<=45 + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + backtest: + normal_backtest_args: + verbose: False + limit_threshold: 0.095 + account: 500000 + benchmark: SH000905 + deal_price: vwap + long_short_backtest_args: + topk: 50 + +Next, we run the following command, and you can see: + +.. code-block:: bash + + ~/v-yindzh/Qlib/cfg$ tuner -c tuner_config.yaml + + Searching params: {'model_space': {'colsample_bytree': 0.8870905643607678, 'lambda_l1': 472.3188735122233, 'lambda_l2': 92.75390994877243, 'learning_rate': 0.09741751430635413, 'loss': 'mse', 'max_depth': 8, 'num_leaves': 160, 'num_threads': 20, 'subsample': 0.7536051584789751}, 'strategy_space': {'buffer_margin': 250, 'topk': 40}} + ... + (Estimator experiment screen log) + ... + Searching params: {'model_space': {'colsample_bytree': 0.6667379039007301, 'lambda_l1': 382.10698024977904, 'lambda_l2': 117.02506488151757, 'learning_rate': 0.18514539615228137, 'loss': 'mse', 'max_depth': 6, 'num_leaves': 200, 'num_threads': 12, 'subsample': 0.9449255686969292}, 'strategy_space': {'buffer_margin': 200, 'topk': 30}} + ... + (Estimator experiment screen log) + ... + Local best params: {'model_space': {'colsample_bytree': 0.6667379039007301, 'lambda_l1': 382.10698024977904, 'lambda_l2': 117.02506488151757, 'learning_rate': 0.18514539615228137, 'loss': 'mse', 'max_depth': 6, 'num_leaves': 200, 'num_threads': 12, 'subsample': 0.9449255686969292}, 'strategy_space': {'buffer_margin': 200, 'topk': 30}} + Time cost: 489.87220 | Finished searching best parameters in Tuner 0. + Time cost: 0.00069 | Finished saving local best tuner parameters to: tuner_experiment/estimator_experiment/estimator_experiment_0/local_best_params.json . + Searching params: {'data_label_space': {'labels': ('Ref($vwap, -2)/Ref($vwap, -1) - 2',)}, 'model_space': {'input_dim': 158, 'lr': 0.001, 'lr_decay': 0.9100529502185579, 'lr_decay_steps': 162.48901403763966, 'optimizer': 'gd', 'output_dim': 1}, 'strategy_space': {'buffer_margin': 300, 'topk': 35}} + ... + (Estimator experiment screen log) + ... + Searching params: {'data_label_space': {'labels': ('Ref($vwap, -2)/Ref($vwap, -1) - 1',)}, 'model_space': {'input_dim': 158, 'lr': 0.1, 'lr_decay': 0.9882802970847494, 'lr_decay_steps': 164.76742865207729, 'optimizer': 'adam', 'output_dim': 1}, 'strategy_space': {'buffer_margin': 250, 'topk': 35}} + ... + (Estimator experiment screen log) + ... + Local best params: {'data_label_space': {'labels': ('Ref($vwap, -2)/Ref($vwap, -1) - 1',)}, 'model_space': {'input_dim': 158, 'lr': 0.1, 'lr_decay': 0.9882802970847494, 'lr_decay_steps': 164.76742865207729, 'optimizer': 'adam', 'output_dim': 1}, 'strategy_space': {'buffer_margin': 250, 'topk': 35}} + Time cost: 550.74039 | Finished searching best parameters in Tuner 1. + Time cost: 0.00023 | Finished saving local best tuner parameters to: tuner_experiment/estimator_experiment/estimator_experiment_1/local_best_params.json . + Time cost: 1784.14691 | Finished tuner pipeline. + Time cost: 0.00014 | Finished save global best tuner parameters. + Best Tuner id: 0. + You can check the best parameters at tuner_experiment/global_best_params.json. + + +Finally, you can check the results of your experiment in the given path. + +Configuration file +------------------ + +Before using `tuner`, you need to prepare a configuration file. Next we will show you how to prepare each part of the configuration file. + +About the experiment +~~~~~~~~~~~~~~~~~~~~ + +First, your configuration file needs to have a field about the experiment, whose key is `experiment`, this field and its contents determine the saving path and tuner class. + +Usually it should contain the following content: + +.. code-block:: YAML + + experiment: + name: tuner_experiment + tuner_class: QLibTuner + +Also, there are some optional fields. The meaning of each field is as follows: + +- `name` + The experiment name, str type, the program will use this experiment name to construct a directory to save the process of the whole experiment and the results. The default value is `tuner_experiment`. + +- `dir` + The saving path, str type, the program will construct the experiment directory in this path. The default value is the path where configuration locate. + +- `tuner_class` + The class of tuner, str type, must be an already implemented model, such as `QLibTuner` in `qlib`, or a custom tuner, but it must be a subclass of `qlib.contrib.tuner.Tuner`, the default value is `QLibTuner`. + +- `tuner_module_path` + The module path, str type, absolute url is also supported, indicates the path of the implementation of tuner. The default value is `qlib.contrib.tuner.tuner` + +About the optimization criteria +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You need to designate a factor to optimize, for tuner need a factor to decide which case is better than other cases. +Usually, we use the result of `estimator`, such as backtest results and the score of model. + +This part needs contain these fields: + +.. code-block:: YAML + + optimization_criteria: + report_type: model + report_factor: model_pearsonr + optim_type: max + +- `report_type` + The type of the report, str type, determines which kind of report you want to use. If you want to use the backtest result type, you can choose `pred_long`, `pred_long_short`, `pred_short`, `sub_bench` and `sub_cost`. If you want to use the model result type, you can only choose `model`. + +- `report_factor` + The factor you want to use in the report, str type, determines which factor you want to optimize. If your `report_type` is backtest result type, you can choose `annual`, `sharpe`, `mdd`, `mean` and `std`. If your `report_type` is model result type, you can choose `model_score` and `model_pearsonr`. + +- `optim_type` + The optimization type, str type, determines what kind of optimization you want to do. you can minimize the factor or maximize the factor, so you can choose `max`, `min` or `correlation` at this field. + Note: `correlation` means the factor's best value is 1, such as `model_pearsonr` (a corraltion coefficient). + +If you want to process the factor or you want fetch other kinds of factor, you can override the `objective` method in your own tuner. + +About the tuner pipeline +~~~~~~~~~~~~~~~~~~~~~~~~ + +The tuner pipeline contains different tuners, and the `tuner` program will process each tuner in pipeline. Each tuner will get an optimal hyper-parameters of its specific combination of modules. The pipeline will contrast the results of each tuner, and get the best combination and its optimal hyper-parameters. So, you need to configurate the pipeline and each tuner, here is an example: + +.. code-block:: YAML + + tuner_pipeline: + - + model: + class: SomeModel + space: SomeModelSpace + trainer: + class: RollingTrainer + strategy: + class: TopkAmountStrategy + space: TopkAmountStrategySpace + max_evals: 2 + +Each part represents a tuner, and its modules which are to be tuned. Space in each part is the hyper-parameters' space of a certain module, you need to create your searching space and modify it in `/qlib/contrib/tuner/space.py`. We use `hyperopt` package to help us to construct the space, you can see the detail of how to use it in https://github.com/hyperopt/hyperopt/wiki/FMin . + +- model + You need to provide the `class` and the `space` of the model. If the model is user's own implementation, you need to privide the `module_path`. + +- trainer + You need to proveide the `class` of the trainer. If the trainer is user's own implementation, you need to privide the `module_path`. + +- strategy + You need to provide the `class` and the `space` of the strategy. If the strategy is user's own implementation, you need to privide the `module_path`. + +- data_label + The label of the data, you can search which kinds of labels will lead to a better result. This part is optional, and you only need to provide `space`. + +- max_evals + Allow up to this many function evaluations in this tuner. The default value is 10. + +If you don't want to search some modules, you can fix their spaces in `space.py`. We will not give the default module. + +About the time period +~~~~~~~~~~~~~~~~~~~~~ + +You need to use the same dataset to evaluate your different `estimator` experiments in `tuner` experiment. Two experiments using different dataset are uncomparable. You can specify `time_period` through the configuration file: + +.. code-block:: YAML + + time_period: + rolling_period: 360 + train_start_date: 2005-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-06-30 + test_start_date: 2016-07-01 + test_end_date: 2018-04-30 + +- `rolling_period` + The rolling period, integer type, indicates how many time steps need rolling when rolling the data. The default value is `60`. If you use `RollingTrainer`, this config will be used, or it will be ignored. + +- `train_start_date` + Training start time, str type. + +- `train_end_date` + Training end time, str type. + +- `validate_start_date` + Validation start time, str type. + +- `validate_end_date` + Validation end time, str type. + +- `test_start_date` + Test start time, str type. + +- `test_end_date` + Test end time, str type. If `test_end_date` is `-1` or greater than the last date of the data, the last date of the data will be used as `test_end_date`. + +About the data and backtest +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`data` and `backtest` are all same in the whole `tuner` experiment. Different `estimator` experiments must use the same data and backtest method. So, these two parts of config are same with that in `estimator` configuration. You can see the precise defination of these parts in `estimator` introduction. We only provide an example here. + +.. code-block:: YAML + + data: + class: ALPHA360 + provider_uri: /data/qlib + args: + start_date: 2005-01-01 + end_date: 2018-04-30 + dropna_label: True + dropna_feature: True + feature_label_config: /home/v-yindzh/v-yindzh/QLib/cfg/feature_config.yaml + filter: + market: csi500 + filter_pipeline: + - + class: NameDFilter + module_path: qlib.filter + args: + name_rule_re: S(?!Z3) + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + - + class: ExpressionDFilter + module_path: qlib.filter + args: + rule_expression: $open/$factor<=45 + fstart_time: 2018-01-01 + fend_time: 2018-12-11 + backtest: + normal_backtest_args: + verbose: False + limit_threshold: 0.095 + account: 500000 + benchmark: SH000905 + deal_price: vwap + long_short_backtest_args: + topk: 50 + +Experiment Result +----------------- + +All the results are stored in experiment file directly, you can check them directly in the corresponding files. +What we save are as following: + +- Global optimal parameters +- Local optimal parameters of each tuner +- Config file of this `tuner` experiment +- Every `estimator` experiments result in the process + diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..8aa9b93b1 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,60 @@ +============================================================ +``Qlib`` Documentation +============================================================ + +``Qlib`` is an AI-oriented quantitative investment platform, which aims to realize the potential, empower the research, and create the value of AI technologies in quantitative investment. + +.. _user_guide: + +Document Structure +==================== + +.. toctree:: + :hidden: + + Home + +.. toctree:: + :maxdepth: 3 + :caption: INTRODUCTION: + + Qlib + +.. toctree:: + :maxdepth: 3 + :caption: GETTING STARTED: + + Installation + Initialization + Data Retrieval + Custom Model Integration + + +.. toctree:: + :maxdepth: 3 + :caption: COMPONENTS: + + Estimator: Workflow Management + Data Layer: Data Framework&Usage + Interday Model: Model Training & Prediction + Interday Strategy: Portfolio Management + Intraday Trading: Model&Strategy Testing + Aanalysis: Evaluation & Results Analysis + +.. toctree:: + :maxdepth: 3 + :caption: ADVANCED TOPICS: + + Building Formulaic Alphas + +.. toctree:: + :maxdepth: 3 + :caption: REFERENCE: + + API + +.. toctree:: + :maxdepth: 3 + :caption: Change Log: + + Change Log diff --git a/docs/introduction/introduction.rst b/docs/introduction/introduction.rst new file mode 100644 index 000000000..f01c00ff9 --- /dev/null +++ b/docs/introduction/introduction.rst @@ -0,0 +1,45 @@ +=============================== +``Qlib``: Quantitative Library +=============================== + +Introduction +=================== + +``Qlib`` is an AI-oriented quantitative investment platform, which aims to realize the potential, empower the research, and create the value of AI technologies in quantitative investment. + +With ``Qlib``, users can easily apply their favorite model to create better Quant investment strategy. + + +Framework +================== + +.. image:: ../_static/img/framework.png + :alt: Framework + + +At module level, ``Qlib`` is a platform that consists of the above components. Each components is loose-coupling and can be used stand-alone. + +====================== ======================================================================== +Name Description +====================== ======================================================================== +`Data layer` `DataServer` focus on providing high performance infrastructure for user + to retrieve and get raw data. `DataEnhancement` will preprocess the data + and provide the best dataset to be fed in to the models. + +`Interday Model` `Interday model` focus on producing forecasting signals(aka. `alpha`). + Models are trained by `Model Creator` and managed by `Model Manager`. + User could choose one or multiple models for forecasting. Multiple models + could be combined with `Ensemble` module. + +`Interday Strategy` `Portfolio Generator` will take forecasting signals as input and output + the orders based on current position to achieve target portfolio. + +`Intraday Trading` `Order Executor` is responsible for executing orders output by + `Interday Strategy` and returning the executed results. + +`Analysis` User could get detailed analysis report of forecasting signal and portfolio + in this part. +====================== ======================================================================== + +- The modules with hand-drawn style is under development and will be released in the future. +- The modules with dashed border is highly user-customizable and extendible. diff --git a/docs/reference/api.rst b/docs/reference/api.rst new file mode 100644 index 000000000..536b09651 --- /dev/null +++ b/docs/reference/api.rst @@ -0,0 +1,117 @@ +================================ +API Reference +================================ + + + +Here you can find all ``QLib`` interfaces. + + +Data +==================== + +Provider +-------------------- + +.. automodule:: qlib.data.data + :members: + +Filter +-------------------- + +.. automodule:: qlib.data.filter + :members: + +Feature +-------------------- + +Class +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: qlib.data.base + :members: + +Operator +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: qlib.data.ops + :members: + +Cache +---------------- +.. autoclass:: qlib.data.cache.MemCacheUnit + :members: + +.. autoclass:: qlib.data.cache.MemCache + :members: + +.. autoclass:: qlib.data.cache.ExpressionCache + :members: + +.. autoclass:: qlib.data.cache.DatasetCache + :members: + +.. autoclass:: qlib.data.cache.ServerExpressionCache + :members: + +.. autoclass:: qlib.data.cache.ServerDatasetCache + :members: + + +Contrib +==================== + + +Data Handler +--------------- +.. automodule:: qlib.contrib.estimator.handler + :members: + +Model +-------------------- +.. automodule:: qlib.contrib.model.base + :members: + +Strategy +------------------- + +.. automodule:: qlib.contrib.strategy.strategy + :members: + +Evaluate +----------------- + +.. automodule:: qlib.contrib.evaluate + :members: + + +Report +----------------- + +.. automodule:: qlib.contrib.report.analysis_position.report + :members: + + + +.. automodule:: qlib.contrib.report.analysis_position.score_ic + :members: + + + +.. automodule:: qlib.contrib.report.analysis_position.cumulative_return + :members: + + + +.. automodule:: qlib.contrib.report.analysis_position.risk_analysis + :members: + + + +.. automodule:: qlib.contrib.report.analysis_position.rank_label + :members: + + + +.. automodule:: qlib.contrib.report.analysis_model.analysis_model_performance + :members: + + diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..ea9582e0a --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +Cython==0.29.21 \ No newline at end of file diff --git a/docs/start/getdata.rst b/docs/start/getdata.rst new file mode 100644 index 000000000..192712bb5 --- /dev/null +++ b/docs/start/getdata.rst @@ -0,0 +1,137 @@ +.. _getdata: +============================= +Data Retrieval +============================= + +.. currentmodule:: qlib + +Introduction +==================== + +Users can get stock data by ``Qlib``. Following examples will demonstrate the basic user interface. + +Examples +==================== + + +``QLib`` Initialization: + +.. note:: In order to get the data, users need to initialize ``Qlib`` with `qlib.init` first. Please refer to `initialization `_. + +It is recommended to use the following code to initialize qlib: + +.. code-block:: python + + >>> import qlib + >>> qlib.init(provider_uri='~/.qlib/qlib_data/cn_data') + + +Load trading calendar with the given time range and frequency: + +.. code-block:: python + + >>> from qlib.data import D + >>> D.calendar(start_time='2010-01-01', end_time='2017-12-31', freq='day')[:2] + [Timestamp('2010-01-04 00:00:00'), Timestamp('2010-01-05 00:00:00')] + +Parse a given market name into a stockpool config: + +.. code-block:: python + + >>> from qlib.data import D + >>> D.instruments(market='all') + {'market': 'all', 'filter_pipe': []} + +Load instruments of certain stockpool in the given time range: + +.. code-block:: python + + >>> from qlib.data import D + >>> instruments = D.instruments(market='csi300') + >>> D.list_instruments(instruments=instruments, start_time='2010-01-01', end_time='2017-12-31', as_list=True)[:6] + + +Load dynamic instruments from a base market according to a name filter + +.. code-block:: python + + >>> from qlib.data import D + >>> from qlib.data.filter import NameDFilter + >>> nameDFilter = NameDFilter(name_rule_re='SH[0-9]{4}55') + >>> instruments = D.instruments(market='csi300', filter_pipe=[nameDFilter]) + >>> D.list_instruments(instruments=instruments, start_time='2015-01-01', end_time='2016-02-15', as_list=True) + +Load dynamic instruments from a base market according to an expression filter + +.. code-block:: python + + >>> from qlib.data import D + >>> from qlib.data.filter import ExpressionDFilter + >>> expressionDFilter = ExpressionDFilter(rule_expression='$close>100') + >>> instruments = D.instruments(market='csi300', filter_pipe=[expressionDFilter]) + >>> D.list_instruments(instruments=instruments, start_time='2015-01-01', end_time='2016-02-15', as_list=True) + +To know more about how to use the filter or how to build one's own filter, go to API Reference: `filter API <../reference/api.html#filter>`_ + +Load features of certain instruments in given time range: + +.. note:: This is not a recommended way to get features. + +.. code-block:: python + + >>> from qlib.data import D + >>> instruments = ['SH600000'] + >>> fields = ['$close', '$volume', 'Ref($close, 1)', 'Mean($close, 3)', '$high-$low'] + >>> D.features(instruments, fields, start_time='2010-01-01', end_time='2017-12-31', freq='day').head() + $close $volume Ref($close,1) Mean($close,3) \ + instrument datetime + SH600000 2010-01-04 81.809998 17144536.0 NaN 81.809998 + 2010-01-05 82.419998 29827816.0 81.809998 82.114998 + 2010-01-06 80.800003 25070040.0 82.419998 81.676666 + 2010-01-07 78.989998 22077858.0 80.800003 80.736666 + 2010-01-08 79.879997 17019168.0 78.989998 79.889999 + + Sub($high,$low) + instrument datetime + SH600000 2010-01-04 2.741158 + 2010-01-05 3.049736 + 2010-01-06 1.621399 + 2010-01-07 2.856926 + 2010-01-08 1.930397 + 2010-01-08 1.930397 + +Load features of certain stockpool in given time range: + +.. note:: Since the server need to cache all-time data for your request stockpool and fields, it may take longer to process your request than before. But in the second time, your request will be processed and responded in a flash even if you change the timespan. + +.. code-block:: python + + >>> from qlib.data import D + >>> from qlib.data.filter import NameDFilter, ExpressionDFilter + >>> nameDFilter = NameDFilter(name_rule_re='SH[0-9]{4}55') + >>> expressionDFilter = ExpressionDFilter(rule_expression='($close/$factor)>100') + >>> instruments = D.instruments(market='csi300', filter_pipe=[nameDFilter, expressionDFilter]) + >>> fields = ['$close', '$volume', 'Ref($close, 1)', 'Mean($close, 3)', '$high-$low'] + >>> D.features(instruments, fields, start_time='2010-01-01', end_time='2017-12-31', freq='day').head() + + $close $volume Ref($close, 1) \ + instrument datetime + SH600655 2015-06-15 4342.160156 258706.359375 4530.459961 + 2015-06-16 4409.270020 257349.718750 4342.160156 + 2015-06-17 4312.330078 235214.890625 4409.270020 + 2015-06-18 4086.729980 196772.859375 4312.330078 + 2015-06-19 3678.250000 182916.453125 4086.729980 + Mean($close, 3) high− low + instrument datetime + SH600655 2015-06-15 4480.743327 285.251465 + 2015-06-16 4427.296712 298.301270 + 2015-06-16 4354.586751 356.098145 + 2015-06-16 4269.443359 363.554932 + 2015-06-16 4025.770020 368.954346 + + +.. note:: When calling D.features() at client, use parameter 'disk_cache=0' to skip dataset cache, use 'disk_cache=1' to generate and use dataset cache. In addition, when calling at server, you can use 'disk_cache=2' to update the dataset cache. + +API +==================== +To know more about how to use the Data, go to API Reference: `Data API <../reference/api.html#Data>`_ diff --git a/docs/start/initialization.rst b/docs/start/initialization.rst new file mode 100644 index 000000000..94dc6e551 --- /dev/null +++ b/docs/start/initialization.rst @@ -0,0 +1,60 @@ +.. _initialization: +==================== +Qlib Initialization +==================== + +.. currentmodule:: qlib + + +Initialization +========================= + +Please execute the following process to initialize ``Qlib``. + +- Download and prepare the Data: execute the following command to download the stock data. + .. code-block:: bash + + python scripts/get_data.py qlib_data_cn --target_dir ~/.qlib/qlib_data/cn_data + + Know more about how to use ``get_data.py``, refer to `Raw Data <../advanced/data.html#raw-data>`_. + + +- Run the initialization code: run the following code in python: + + .. code-block:: Python + + import qlib + # region in [REG_CN, REG_US] + from qlib.config import REG_CN + provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir + qlib.init(provider_uri=provider_uri, region=REG_CN) + + + +Parameters +------------------- + +In fact, in addition to `provider_uri` and `region`, `qlib.init` has other parameters. The following are all the parameters of `qlib.init`: + +- `provider_uri` + Type: str. The local directory where the data loaded by ``get_data.py`` is stored. +- `region` + Type: str, optional parameter(default: ``qlib.config.REG_CN``). + Currently: ``qlib.config.REG_US``('us') and ``qlib.config.REG_CN``('cn') is supported. Different value of ``region`` will + result in different stock market mode. + + - ``qlib.config.REG_US``: US stock market. + - ``qlib.config.REG_CN``: China stock market. +- `redis_host` + Type: str, optional parameter(default: "127.0.0.1"), host of `redis` + The lock and cache mechanism relies on redis. +- `redis_port` + Type: int, optional parameter(default: 6379), port of `redis` + + .. note:: + + The value of `region` should be aligned with the data stored in `provider_uri`. Currently, ``scripts/get_data.py`` only provides China stock market data. If users want to use the US stock market data, they should prepare their own US-stock data in `provider_uri` and switch to US-stock mode. + + .. note:: + + If redis connection failed with `redis_host` and `redis_port`, cache will not be used! Please refer to `Cache <../advanced/cache.rst>`_. diff --git a/docs/start/installation.rst b/docs/start/installation.rst new file mode 100644 index 000000000..48b4f8e19 --- /dev/null +++ b/docs/start/installation.rst @@ -0,0 +1,43 @@ +.. _installation: +==================== +Installation +==================== + +.. currentmodule:: qlib + + +How to Install ``Qlib`` +==================== + +``Qlib`` only supports Python3, and supports up to Python3.8. + +Please execute the following process to install ``Qlib``: + +- Change the directory to ``Qlib``, in which the file ``setup.py`` exists. +- Then, please execute the following command: + + .. code-block:: bash + + $ pip install numpy + $ pip install --upgrade cython + $ python setup.py install + + +.. note:: + It's recommended to use anaconda/miniconda to setup environment. + ``Qlib`` needs lightgbm and tensorflow packages, use pip to install them. + +.. note:: + Do not import qlib in the repository folder which contains ``qlib``, otherwise errors may occur. + + + +Use the following code to confirm installation successful: + +.. code-block:: python + + >>> import qlib + >>> qlib.__version__ + + + diff --git a/docs/start/integration.rst b/docs/start/integration.rst new file mode 100644 index 000000000..a81e77dbd --- /dev/null +++ b/docs/start/integration.rst @@ -0,0 +1,146 @@ +========================================= +Custom Model Integration +========================================= + +Introduction +=================== + +``Qlib`` provides ``lightGBM`` and ``Dnn`` model as the baseline of ``Interday Model``. In addition to the default model, users can integrate their own custom models into ``Qlib``. + +Users can integrate their own custom models according to the following steps. + +- Define a custom model class, which should be a subclass of the `qlib.contrib.model.base.Model <../reference/api.html#module-qlib.contrib.model.base>`_ +- Write a configuration file that describes the path and parameters of the custom model +- Test the custom model + +Custom Model Class +=========================== +The Custom models need to inherit `qlib.contrib.model.base.Model <../reference/api.html#module-qlib.contrib.model.base>`_ and override the methods in it. + +- Override the `__init__` method + - ``Qlib`` passes the initialized parameters to the \_\_init\_\_ method + - The parameter must be consistent with the hyperparameters in the configuration file. + - Code Example: In the following example, the hyperparameter filed of the configuration file should contain parameters such as ‘loss:mse’. + .. code-block:: Python + + def __init__(self, loss='mse', **kwargs): + if loss not in {'mse', 'binary'}: + raise NotImplementedError + self._scorer = mean_squared_error if loss == 'mse' else roc_auc_score + self._params.update(objective=loss, **kwargs) + self._model = None + +- Override the `fit` method + - ``Qlib`` calls the fit method to train the model + - The parameters must include training feature 'x_train', training label 'y_train', test feature 'x_valid', test label 'y_valid'at least. + - The parameters could include some optional parameters with default values, such as train weight 'w_train', test weight 'w_valid' and 'num_boost_round = 1000'. + - Code Example: In the following example, 'num_boost_round = 1000' is an optional parameter. + .. code-block:: Python + + def fit(self, x_train:pd.DataFrame, y_train:pd.DataFrame, x_valid:pd.DataFrame, y_valid:pd.DataFrame, + w_train:pd.DataFrame = None, w_valid:pd.DataFrame = None, num_boost_round = 1000, **kwargs): + + # Lightgbm need 1D array as its label + if y_train.values.ndim == 2 and y_train.values.shape[1] == 1: + y_train_1d, y_valid_1d = np.squeeze(y_train.values), np.squeeze(y_valid.values) + else: + raise ValueError('LightGBM doesn\'t support multi-label training') + + w_train_weight = None if w_train is None else w_train.values + w_valid_weight = None if w_valid is None else w_valid.values + + dtrain = lgb.Dataset(x_train.values, label=y_train_1d, weight=w_train_weight) + dvalid = lgb.Dataset(x_valid.values, label=y_valid_1d, weight=w_valid_weight) + self._model = lgb.train( + self._params, + dtrain, + num_boost_round=num_boost_round, + valid_sets=[dtrain, dvalid], + valid_names=['train', 'valid'], + **kwargs + ) + +- Override the `predict` method + - The parameters include the test features + - Return the prediction score + - Please refer to `qlib.contrib.model.base.Model <../reference/api.html#module-qlib.contrib.model.base>`_ for the parameter types of the fit method + - Code Example:In the following example, user need to user dnn to predict the label(such as 'preds') of test data 'x_test' and return it. + .. code-block:: Python + + def predict(self, x_test:pd.DataFrame, **kwargs)-> numpy.ndarray: + if self._model is None: + raise ValueError('model is not fitted yet!') + return self._model.predict(x_test.values) + +- Override the `score` method + - The parameters include the test features and test labels + - Return the evaluation score of model. It's recommended to adopt the loss between labels and prediction score. + - Code Example:In the following example, user need to calculate the weighted loss with test data 'x_test', test label 'y_test' and the weight 'w_test'. + .. code-block:: Python + + def score(self, x_test:pd.Dataframe, y_test:pd.Dataframe, w_test:pd.DataFrame = None) -> float: + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, w_test = drop_nan_by_y_index(x_test, y_test, w_test) + preds = self.predict(x_test) + w_test_weight = None if w_test is None else w_test.values + scorer = mean_squared_error if self.loss_type == 'mse' else roc_auc_score + return scorer(y_test.values, preds, sample_weight=w_test_weight) + +- Override the `save` method & `load` method + - The `save` method parameter include the a `filename` that represents an absolute path, user need to save model into the path. + - The `load` method parameter include the a `buffer` read from the `filename` passed in `save` method , user need to load model from the `buffer`. + - Code Example: + .. code-block:: Python + + def save(self, filename): + if self._model is None: + raise ValueError('model is not fitted yet!') + self._model.save_model(filename) + + def load(self, buffer): + self._model = lgb.Booster(params={'model_str': buffer.decode('utf-8')}) + + +Configuration File +======================= + +The configuration file is described in detail in the `estimator <../advanced/estimator.html#Example>`_ document. In order to integrate the custom model into ``Qlib``, you need to modify the "model" field in the configuration file. + +- Example: The following example describes the ‘model’ field of configuration file about the custom lightgbm model mentioned above , where ‘module_path’ is the module path, ‘class’ is the class name, and ‘args’ is the hyperparameter passed into the __init__ method. All parameters in the field is passed to 'self._params' by '\*\*kwargs' in `__init__` except 'loss = mse'. + +.. code-block:: YAML + + model: + class: LGBModel + module_path: qlib.contrib.model.gbdt + args: + loss: mse + colsample_bytree: 0.8879 + learning_rate: 0.0421 + subsample: 0.8789 + lambda_l1: 205.6999 + lambda_l2: 580.9768 + max_depth: 8 + num_leaves: 210 + num_threads: 20 + +Users could find configuration file of the baseline of the ``Model`` in ``qlib/examples/estimator/estimator_config.yaml`` and ``qlib/examples/estimator/estimator_config_dnn.yaml`` + +Model Testing +===================== +Assuming that the configuration file is ``examples/estimator/estimator_config.yaml``, user can run the following command to test the custom model: + +.. code-block:: bash + + cd examples # Avoid running program under the directory contains `qlib` + estimator -c estimator/estimator_config.yaml + +.. note:: ``estimator`` is a built-in command of ``Qlib``. + +Also, ``Model`` can also be tested as a single module. An example has been given in ``examples.estimator.train_backtest_analyze.ipynb``. + + +Reference +===================== + +To know more about ``Model``, please refer to `Interday Model: Model Training & Prediction <../advanced/model.rst>`_ and `Model API <../reference/api.html#module-qlib.contrib.model.base>`_. diff --git a/examples/estimator/analyze_from_estimator.ipynb b/examples/estimator/analyze_from_estimator.ipynb new file mode 100644 index 000000000..b0dd8a82d --- /dev/null +++ b/examples/estimator/analyze_from_estimator.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import json\n", + "import yaml\n", + "import pickle\n", + "from pathlib import Path\n", + "\n", + "import qlib\n", + "import pandas as pd\n", + "from qlib.config import REG_CN\n", + "from qlib.utils import exists_qlib_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "CUR_DIR = Path.cwd()\n", + "MARKET = \"csi300\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# use default data\n", + "# NOTE: need to download data from remote: python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data\n", + "provider_uri = \"~/.qlib/qlib_data/cn_data\" # target_dir\n", + "if not exists_qlib_data(provider_uri):\n", + " print(f\"Qlib data is not found in {provider_uri}\")\n", + " sys.path.append(str(CUR_DIR.parent.parent.joinpath(\"scripts\")))\n", + " from get_data import GetData\n", + " GetData().qlib_data_cn(provider_uri)\n", + "qlib.init(provider_uri=provider_uri, region=REG_CN)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with CUR_DIR.joinpath('estimator_config.yaml').open() as fp:\n", + " estimator_name = yaml.load(fp, Loader=yaml.FullLoader)['experiment']['name']\n", + "with CUR_DIR.joinpath(estimator_name, 'exp_info.json').open() as fp:\n", + " latest_id = json.load(fp)['id']\n", + " \n", + "estimator_dir = CUR_DIR.joinpath(estimator_name, 'sacred', latest_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# read estimator result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred_df = pd.read_pickle(estimator_dir.joinpath('pred.pkl'))\n", + "report_normal_df = pd.read_pickle(estimator_dir.joinpath('report_normal.pkl'))\n", + "report_normal_df.index.names = ['index']\n", + "\n", + "analysis_df = pd.read_pickle(estimator_dir.joinpath('analysis.pkl'))\n", + "positions = pickle.load(estimator_dir.joinpath('positions.pkl').open('rb'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# get label data from qlib" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from qlib.data import D\n", + "pred_df_dates = pred_df.index.get_level_values(level='datetime')\n", + "features_df = D.features(D.instruments(MARKET), ['Ref($close, -1)/$close - 1'], pred_df_dates.min(), pred_df_dates.max())\n", + "features_df.columns = ['label']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# analyze graphs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from qlib.contrib.report import analysis_model, analysis_position" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## analysis position" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "analysis_position.report_graph(report_normal_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### score IC" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred_label = pd.concat([features_df, pred_df], axis=1, sort=True).reindex(features_df.index)\n", + "analysis_position.score_ic_graph(pred_label)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### cumulative return" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_position.cumulative_return_graph(positions, report_normal_df, features_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### risk analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_position.risk_analysis_graph(analysis_df, report_normal_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### rank label" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "analysis_position.rank_label_graph(positions, features_df, pred_df_dates.min(), pred_df_dates.max())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## analysis model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### model performance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_model.model_performance_graph(pred_label)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/estimator/estimator_config.yaml b/examples/estimator/estimator_config.yaml new file mode 100644 index 000000000..b6d9fd9f7 --- /dev/null +++ b/examples/estimator/estimator_config.yaml @@ -0,0 +1,55 @@ +experiment: + name: estimator_example + observer_type: file_storage + mode: train + +model: + class: LGBModel + module_path: qlib.contrib.model.gbdt + args: + loss: mse + colsample_bytree: 0.8879 + learning_rate: 0.0421 + subsample: 0.8789 + lambda_l1: 205.6999 + lambda_l2: 580.9768 + max_depth: 8 + num_leaves: 64 + num_threads: 20 + min_data_in_leaf: 10 +data: + class: QLibDataHandlerClose + args: + dropna_label: True + filter: + market: csi300 +trainer: + class: StaticTrainer + args: + train_start_date: 2008-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-12-31 + test_start_date: 2017-01-01 + test_end_date: 2020-08-01 +strategy: + class: TopkDropoutStrategy + args: + topk: 50 + n_drop: 5 +backtest: + normal_backtest_args: + verbose: False + limit_threshold: 0.095 + account: 100000000 + benchmark: SH000300 + deal_price: close + open_cost: 0.0005 + close_cost: 0.0015 + min_cost: 5 + +qlib_data: + # when testing, please modify the following parameters according to the specific environment + provider_uri: "~/.qlib/qlib_data/cn_data" + region: "cn" + redis_port: 4312 diff --git a/examples/estimator/estimator_config_dnn.yaml b/examples/estimator/estimator_config_dnn.yaml new file mode 100644 index 000000000..72f14f71f --- /dev/null +++ b/examples/estimator/estimator_config_dnn.yaml @@ -0,0 +1,57 @@ +experiment: + name: estimator_example + observer_type: file_storage + mode: train + +model: + module_path: qlib.contrib.model.pytorch_nn + class: DNNModelPytorch + args: + loss: mse + input_dim: 158 + output_dim: 1 + lr: 0.002 + lr_decay: 0.96 + lr_decay_steps: 100 + optimizer: 'adam' + max_steps: 8000 + batch_size: 4096 + GPU: '0' +data: + class: QLibDataHandlerClose + args: + dropna_label: True + dropna_feature: True + filter: + market: csi300 +trainer: + class: StaticTrainer + args: + train_start_date: 2007-01-01 + train_end_date: 2014-12-31 + validate_start_date: 2015-01-01 + validate_end_date: 2016-12-31 + test_start_date: 2017-01-01 + test_end_date: 2020-08-01 +strategy: + class: TopkDropoutStrategy + args: + topk: 50 + n_drop: 5 +backtest: + normal_backtest_args: + verbose: False + limit_threshold: 0.095 + account: 100000000 + benchmark: SH000300 + deal_price: close + open_cost: 0.0005 + close_cost: 0.0015 + min_cost: 5 + long_short_backtest_args: + topk: 50 + +qlib_data: + # when testing, please modify the following parameters according to the specific environment + provider_uri: "~/.qlib/qlib_data/cn_data" + region: "cn" diff --git a/examples/train_and_backtest.py b/examples/train_and_backtest.py new file mode 100644 index 000000000..6c05b1606 --- /dev/null +++ b/examples/train_and_backtest.py @@ -0,0 +1,119 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import sys +from pathlib import Path + +import qlib +import pandas as pd +from qlib.config import REG_CN +from qlib.contrib.model.gbdt import LGBModel +from qlib.contrib.estimator.handler import QLibDataHandlerClose +from qlib.contrib.strategy.strategy import TopkDropoutStrategy +from qlib.contrib.evaluate import ( + backtest as normal_backtest, + risk_analysis, +) +from qlib.utils import exists_qlib_data + + +if __name__ == "__main__": + + # use default data + provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir + if not exists_qlib_data(provider_uri): + print(f"Qlib data is not found in {provider_uri}") + sys.path.append(str(Path(__file__).resolve().parent.parent.joinpath("scripts"))) + from get_data import GetData + + GetData().qlib_data_cn(provider_uri) + + qlib.init(provider_uri=provider_uri, region=REG_CN) + + MARKET = "CSI300" + BENCHMARK = "SH000300" + + ################################### + # train model + ################################### + DATA_HANDLER_CONFIG = { + "dropna_label": True, + "start_date": "2008-01-01", + "end_date": "2020-08-01", + "market": MARKET, + } + + TRAINER_CONFIG = { + "train_start_date": "2008-01-01", + "train_end_date": "2014-12-31", + "validate_start_date": "2015-01-01", + "validate_end_date": "2016-12-31", + "test_start_date": "2017-01-01", + "test_end_date": "2020-08-01", + } + + # use default DataHandler + # custom DataHandler, refer to: TODO: DataHandler API url + x_train, y_train, x_validate, y_validate, x_test, y_test = QLibDataHandlerClose( + **DATA_HANDLER_CONFIG + ).get_split_data(**TRAINER_CONFIG) + + MODEL_CONFIG = { + "loss": "mse", + "colsample_bytree": 0.8879, + "learning_rate": 0.0421, + "subsample": 0.8789, + "lambda_l1": 205.6999, + "lambda_l2": 580.9768, + "max_depth": 8, + "num_leaves": 210, + "num_threads": 20, + } + # use default model + # custom Model, refer to: TODO: Model API url + model = LGBModel(**MODEL_CONFIG) + model.fit(x_train, y_train, x_validate, y_validate) + _pred = model.predict(x_test) + _pred = pd.DataFrame(_pred, index=x_test.index, columns=y_test.columns) + + # backtest requires pred_score + pred_score = pd.DataFrame(index=_pred.index) + pred_score["score"] = _pred.iloc(axis=1)[0] + + # save pred_score to file + pred_score_path = Path("~/tmp/qlib/pred_score.pkl").expanduser() + pred_score_path.parent.mkdir(exist_ok=True, parents=True) + pred_score.to_pickle(pred_score_path) + + ################################### + # backtest + ################################### + STRATEGY_CONFIG = { + "topk": 50, + "n_drop": 5, + } + BACKTEST_CONFIG = { + "verbose": False, + "limit_threshold": 0.095, + "account": 100000000, + "benchmark": BENCHMARK, + "deal_price": "close", + "open_cost": 0.0005, + "close_cost": 0.0015, + "min_cost": 5, + } + + # use default strategy + # custom Strategy, refer to: TODO: Strategy API url + strategy = TopkDropoutStrategy(**STRATEGY_CONFIG) + report_normal, positions_normal = normal_backtest(pred_score, strategy=strategy, **BACKTEST_CONFIG) + + ################################### + # analyze + # If need a more detailed analysis, refer to: examples/train_and_bakctest.ipynb + ################################### + analysis = dict() + analysis["sub_bench"] = risk_analysis(report_normal["return"] - report_normal["bench"]) + analysis["sub_cost"] = risk_analysis(report_normal["return"] - report_normal["bench"] - report_normal["cost"]) + analysis_df = pd.concat(analysis) # type: pd.DataFrame + print(analysis_df) diff --git a/examples/train_backtest_analyze.ipynb b/examples/train_backtest_analyze.ipynb new file mode 100644 index 000000000..dec184ea2 --- /dev/null +++ b/examples/train_backtest_analyze.ipynb @@ -0,0 +1,355 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "\n", + "import qlib\n", + "import pandas as pd\n", + "from qlib.config import REG_CN\n", + "from qlib.contrib.model.gbdt import LGBModel\n", + "from qlib.contrib.estimator.handler import QLibDataHandlerClose\n", + "from qlib.contrib.strategy.strategy import TopkDropoutStrategy\n", + "from qlib.contrib.evaluate import (\n", + " backtest as normal_backtest,\n", + " risk_analysis,\n", + ")\n", + "from qlib.utils import exists_qlib_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# use default data\n", + "# NOTE: need to download data from remote: python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data\n", + "provider_uri = \"~/.qlib/qlib_data/cn_data\" # target_dir\n", + "if not exists_qlib_data(provider_uri):\n", + " print(f\"Qlib data is not found in {provider_uri}\")\n", + " sys.path.append(str(Path.cwd().parent.joinpath(\"scripts\")))\n", + " from get_data import GetData\n", + " GetData().qlib_data_cn(provider_uri)\n", + "qlib.init(provider_uri=provider_uri, region=REG_CN)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "MARKET = \"csi300\"\n", + "BENCHMARK = \"SH000300\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# train model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "###################################\n", + "# train model\n", + "###################################\n", + "DATA_HANDLER_CONFIG = {\n", + " \"dropna_label\": True,\n", + " \"start_date\": \"2008-01-01\",\n", + " \"end_date\": \"2020-08-01\",\n", + " \"market\": MARKET,\n", + "}\n", + "\n", + "TRAINER_CONFIG = {\n", + " \"train_start_date\": \"2008-01-01\",\n", + " \"train_end_date\": \"2014-12-31\",\n", + " \"validate_start_date\": \"2015-01-01\",\n", + " \"validate_end_date\": \"2016-12-31\",\n", + " \"test_start_date\": \"2017-01-01\",\n", + " \"test_end_date\": \"2020-08-01\",\n", + "}\n", + "\n", + "# use default DataHandler\n", + "# custom DataHandler, refer to: TODO: DataHandler api url\n", + "x_train, y_train, x_validate, y_validate, x_test, y_test = QLibDataHandlerClose(**DATA_HANDLER_CONFIG).get_split_data(**TRAINER_CONFIG)\n", + "\n", + "\n", + "MODEL_CONFIG = {\n", + " \"loss\": \"mse\",\n", + " \"colsample_bytree\": 0.8879,\n", + " \"learning_rate\": 0.0421,\n", + " \"subsample\": 0.8789,\n", + " \"lambda_l1\": 205.6999,\n", + " \"lambda_l2\": 580.9768,\n", + " \"max_depth\": 8,\n", + " \"num_leaves\": 210,\n", + " \"num_threads\": 20,\n", + "}\n", + "# use default model\n", + "# custom Model, refer to: TODO: Model api url\n", + "model = LGBModel(**MODEL_CONFIG)\n", + "model.fit(x_train, y_train, x_validate, y_validate)\n", + "_pred = model.predict(x_test)\n", + "_pred = pd.DataFrame(_pred, index=x_test.index, columns=y_test.columns)\n", + "\n", + "# backtest requires pred_score\n", + "pred_score = pd.DataFrame(index=_pred.index)\n", + "pred_score[\"score\"] = _pred.iloc(axis=1)[0]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# backtest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "###################################\n", + "# backtest\n", + "###################################\n", + "STRATEGY_CONFIG = {\n", + " \"topk\": 50,\n", + " \"n_drop\": 5", + "}\n", + "BACKTEST_CONFIG = {\n", + " \"verbose\": False,\n", + " \"limit_threshold\": 0.095,\n", + " \"account\": 100000000,\n", + " \"benchmark\": BENCHMARK,\n", + " \"deal_price\": \"close\",\n", + " \"open_cost\": 0.0005,\n", + " \"close_cost\": 0.0015,\n", + " \"min_cost\": 5,\n", + " \n", + "}\n", + "\n", + "# use default strategy\n", + "# custom Strategy, refer to: TODO: Strategy api url\n", + "strategy = TopkDropoutStrategy(**STRATEGY_CONFIG)\n", + "report_normal, positions_normal = normal_backtest(pred_score, strategy=strategy, **BACKTEST_CONFIG)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# analyze" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "###################################\n", + "# analyze\n", + "# If need a more detailed analysis, refer to: examples/train_and_bakctest.ipynb\n", + "###################################\n", + "analysis = dict()\n", + "analysis[\"sub_bench\"] = risk_analysis(report_normal[\"return\"] - report_normal[\"bench\"])\n", + "analysis[\"sub_cost\"] = risk_analysis(\n", + " report_normal[\"return\"] - report_normal[\"bench\"] - report_normal[\"cost\"]\n", + ")\n", + "analysis_df = pd.concat(analysis) # type: pd.DataFrame\n", + "print(analysis_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# analyze graphs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from qlib.contrib.report import analysis_model, analysis_position" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get label data\n", + "from qlib.data import D\n", + "pred_df_dates = pred_score.index.get_level_values(level='datetime')\n", + "features_df = D.features(D.instruments(MARKET), ['Ref($close, -1)/$close - 1'], pred_df_dates.min(), pred_df_dates.max())\n", + "features_df.columns = ['label']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## analysis position" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "analysis_position.report_graph(report_normal)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### score IC" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred_label = pd.concat([features_df, pred_score], axis=1, sort=True).reindex(features_df.index)\n", + "analysis_position.score_ic_graph(pred_label)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### cumulative return" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_position.cumulative_return_graph(positions_normal, report_normal, features_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### risk analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_position.risk_analysis_graph(analysis_df, report_normal)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### rank label" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "analysis_position.rank_label_graph(positions_normal, features_df, pred_df_dates.min(), pred_df_dates.max())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## analysis model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### model performance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "analysis_model.model_performance_graph(pred_label)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/qlib/__init__.py b/qlib/__init__.py new file mode 100644 index 000000000..1e79540d8 --- /dev/null +++ b/qlib/__init__.py @@ -0,0 +1,197 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +__version__ = "0.4.6.dev" + +import os +import copy +import logging +import re +import subprocess +import platform +from pathlib import Path + +from .utils import can_use_cache + + +# init qlib +def init(default_conf="client", **kwargs): + from .config import ( + C, + _default_client_config, + _default_server_config, + _default_region_config, + REG_CN, + ) + from .data.data import register_all_wrappers + from .log import get_module_logger, set_log_with_config + + _logging_config = C.logging_config + if "logging_config" in kwargs: + _logging_config = kwargs["logging_config"] + + # set global config + if _logging_config: + set_log_with_config(_logging_config) + + LOG = get_module_logger("Initialization", level=logging.INFO) + LOG.info(f"default_conf: {default_conf}.") + if default_conf == "server": + base_config = copy.deepcopy(_default_server_config) + elif default_conf == "client": + base_config = copy.deepcopy(_default_client_config) + else: + raise ValueError("Unknown system type") + if base_config: + base_config.update(_default_region_config[kwargs.get("region", REG_CN)]) + for k, v in base_config.items(): + C[k] = v + + for k, v in kwargs.items(): + C[k] = v + if k not in C: + LOG.warning("Unrecognized config %s" % k) + + if default_conf == "client": + C["mount_path"] = str(Path(C["mount_path"]).expanduser().resolve()) + if not (C["expression_cache"] is None and C["dataset_cache"] is None): + # check redis + if not can_use_cache(): + LOG.warning( + f"redis connection failed(host={C['redis_host']} port={C['redis_port']}), cache will not be used!" + ) + C["expression_cache"] = None + C["dataset_cache"] = None + + # check path if server/local + if re.match("^[^/ ]+:.+", C["provider_uri"]) is None: + C["provider_uri"] = str(Path(C["provider_uri"]).expanduser().resolve()) + if not os.path.exists(C["provider_uri"]): + if C["auto_mount"]: + LOG.error( + "Invalid provider uri: {}, please check if a valid provider uri has been set. This path does not exist.".format( + C["provider_uri"] + ) + ) + else: + LOG.warning("auto_path is False, please make sure {} is mounted".format(C["mount_path"])) + else: + mount_command = "sudo mount.nfs %s %s" % (C["provider_uri"], C["mount_path"]) + # If the provider uri looks like this 172.23.233.89//data/csdesign' + # It will be a nfs path. The client provider will be used + if not C["auto_mount"]: + if not os.path.exists(C["mount_path"]): + raise FileNotFoundError( + "Invalid mount path: {}! Please mount manually: {} or Set init parameter `auto_mount=True`".format( + C["mount_path"], mount_command + ) + ) + else: + # Judging system type + sys_type = platform.system() + if "win" in sys_type.lower(): + # system: window + exec_result = os.popen("mount -o anon %s %s" % (C["provider_uri"], C["mount_path"] + ":")) + result = exec_result.read() + if "85" in result: + LOG.warning("already mounted or window mount path already exists") + elif "53" in result: + raise OSError("not find network path") + elif "error" in result or "错误" in result: + raise OSError("Invalid mount path") + elif C["provider_uri"] in result: + LOG.info("window success mount..") + else: + raise OSError(f"unknown error: {result}") + + # config mount path + C["mount_path"] = C["mount_path"] + ":\\" + else: + # system: linux/Unix/Mac + # check mount + _remote_uri = C["provider_uri"] + _remote_uri = _remote_uri[:-1] if _remote_uri.endswith("/") else _remote_uri + _mount_path = C["mount_path"] + _mount_path = _mount_path[:-1] if _mount_path.endswith("/") else _mount_path + _check_level_num = 2 + _is_mount = False + while _check_level_num: + with subprocess.Popen( + 'mount | grep "{}"'.format(_remote_uri), + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) as shell_r: + _command_log = shell_r.stdout.readlines() + if len(_command_log) > 0: + for _c in _command_log: + _temp_mount = _c.decode("utf-8").split(" ")[2] + _temp_mount = _temp_mount[:-1] if _temp_mount.endswith("/") else _temp_mount + if _temp_mount == _mount_path: + _is_mount = True + break + if _is_mount: + break + _remote_uri = "/".join(_remote_uri.split("/")[:-1]) + _mount_path = "/".join(_mount_path.split("/")[:-1]) + _check_level_num -= 1 + + if not _is_mount: + try: + os.makedirs(C["mount_path"], exist_ok=True) + except Exception: + raise OSError( + "Failed to create directory {}, please create {} manually!".format( + C["mount_path"], C["mount_path"] + ) + ) + + # check nfs-common + command_res = os.popen("dpkg -l | grep nfs-common") + command_res = command_res.readlines() + if not command_res: + raise OSError( + "nfs-common is not found, please install it by execute: sudo apt install nfs-common" + ) + # manually mount + command_status = os.system(mount_command) + if command_status == 256: + raise OSError( + "mount {} on {} error! Needs SUDO! Please mount manually: {}".format( + C["provider_uri"], C["mount_path"], mount_command + ) + ) + elif command_status == 32512: + # LOG.error("Command error") + raise OSError("mount {} on {} error! Command error".format(C["provider_uri"], C["mount_path"])) + elif command_status == 0: + LOG.info("Mount finished") + else: + LOG.warning("{} on {} is already mounted".format(_remote_uri, _mount_path)) + + LOG.info("qlib successfully initialized based on %s settings." % default_conf) + register_all_wrappers() + try: + if C["auto_mount"]: + LOG.info(f"provider_uri={C['provider_uri']}") + else: + LOG.info(f"mount_path={C['mount_path']}") + except KeyError: + LOG.info(f"provider_uri={C['provider_uri']}") + + if "flask_server" in C: + LOG.info(f"flask_server={C['flask_server']}, flask_port={C['flask_port']}") + + +def init_from_yaml_conf(conf_path): + """init_from_yaml_conf + + :param conf_path: A path to the qlib config in yml format + """ + import yaml + + with open(conf_path) as f: + config = yaml.load(f, Loader=yaml.FullLoader) + default_conf = config.pop("default_conf", "client") + init(default_conf, **config) diff --git a/qlib/config.py b/qlib/config.py new file mode 100644 index 000000000..18f34e0d9 --- /dev/null +++ b/qlib/config.py @@ -0,0 +1,167 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +# REGION CONST +REG_CN = "cn" +REG_US = "US" + +_default_config = { + # data provider config + "calendar_provider": "LocalCalendarProvider", + "instrument_provider": "LocalInstrumentProvider", + "feature_provider": "LocalFeatureProvider", + "expression_provider": "LocalExpressionProvider", + "dataset_provider": "LocalDatasetProvider", + "provider": "LocalProvider", + # config it in qlib.init() + "provider_uri": "", + # cache + "expression_cache": None, + "dataset_cache": None, + "calendar_cache": None, + # for simple dataset cache + "local_cache_path": None, + "kernels": 16, + # How many tasks belong to one process. Recommend 1 for high-frequency data and None for daily data. + "maxtasksperchild": None, + "default_disk_cache": 1, # 0:skip/1:use + "disable_disk_cache": False, # disable disk cache; if High-frequency data generally disable_disk_cache=True + "mem_cache_size_limit": 500, + # memory cache expire second, only in used 'ClientDatasetCache' and 'client D.calendar' + # default 1 hour + "mem_cache_expire": 60 * 60, + # memory cache space limit, default 5GB, only in used client + "mem_cache_space_limit": 1024 * 1024 * 1024 * 5, + # cache dir name + "dataset_cache_dir_name": "dataset_cache", + "features_cache_dir_name": "features_cache", + # redis + # in order to use cache + "redis_host": "127.0.0.1", + "redis_port": 6379, + "redis_task_db": 1, + # This value can be reset via qlib.init + "logging_level": "INFO", + # Global configuration of qlib log + # logging_level can control the logging level more finely + "logging_config": { + "version": 1, + "formatters": { + "logger_format": { + "format": "[%(process)s:%(threadName)s](%(asctime)s) %(levelname)s - %(name)s - [%(filename)s:%(lineno)d] - %(message)s" + } + }, + "filters": { + "field_not_found": { + "()": "qlib.log.LogFilter", + "param": [".*?WARN: data not found for.*?"], + } + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "level": "DEBUG", + "formatter": "logger_format", + "filters": ["field_not_found"], + } + }, + "loggers": {"qlib": {"level": "DEBUG", "handlers": ["console"]}}, + }, +} + +_default_server_config = { + # data provider config + "calendar_provider": "LocalCalendarProvider", + "instrument_provider": "LocalInstrumentProvider", + "feature_provider": "LocalFeatureProvider", + "expression_provider": "LocalExpressionProvider", + "dataset_provider": "LocalDatasetProvider", + "provider": "LocalProvider", + # config it in qlib.init() + "provider_uri": "", + # redis + "redis_host": "127.0.0.1", + "redis_port": 6379, + "redis_task_db": 1, + "kernels": 64, + # cache + "expression_cache": "ServerExpressionCache", + "dataset_cache": "ServerDatasetCache", +} + +_default_client_config = { + # data provider config + "calendar_provider": "LocalCalendarProvider", + "instrument_provider": "LocalInstrumentProvider", + "feature_provider": "LocalFeatureProvider", + "expression_provider": "LocalExpressionProvider", + "dataset_provider": "LocalDatasetProvider", + "provider": "LocalProvider", + # config it in user's own code + "provider_uri": "~/.qlib/qlib_data/cn_data", + # cache + # Using parameter 'remote' to announce the client is using server_cache, and the writing access will be disabled. + "expression_cache": "ServerExpressionCache", + "dataset_cache": "ServerDatasetCache", + "calendar_cache": None, + # client config + "kernels": 16, + "mount_path": "~/.qlib/qlib_data/cn_data", + "auto_mount": False, # The nfs is already mounted on our server[auto_mount: False]. + # The nfs should be auto-mounted by qlib on other + # serversS(such as PAI) [auto_mount:True] + "timeout": 100, + "logging_level": "INFO", + "region": REG_CN, +} + + +_default_region_config = { + REG_CN: { + "trade_unit": 100, + "limit_threshold": 0.1, + "deal_price": "vwap", + }, + REG_US: { + "trade_unit": 1, + "limit_threshold": None, + "deal_price": "close", + }, +} + + +class Config: + def __getitem__(self, key): + return _default_config[key] + + def __getattr__(self, attr): + try: + return _default_config[attr] + except KeyError: + return AttributeError(f"No such {attr} in _default_config") + + def __setitem__(self, key, value): + _default_config[key] = value + + def __setattr__(self, attr, value): + _default_config[attr] = value + + def __contains__(self, item): + return item in _default_config + + def __getstate__(self): + return _default_config + + def __setstate__(self, state): + _default_config.update(state) + + def __str__(self): + return str(_default_config) + + def __repr__(self): + return str(_default_config) + + +# global config +C = Config() diff --git a/qlib/contrib/__init__.py b/qlib/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/qlib/contrib/backtest/__init__.py b/qlib/contrib/backtest/__init__.py new file mode 100644 index 000000000..31746819c --- /dev/null +++ b/qlib/contrib/backtest/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# -*- coding: utf-8 -*- +from .order import Order +from .account import Account +from .position import Position +from .exchange import Exchange +from .report import Report diff --git a/qlib/contrib/backtest/account.py b/qlib/contrib/backtest/account.py new file mode 100644 index 000000000..4335a6af2 --- /dev/null +++ b/qlib/contrib/backtest/account.py @@ -0,0 +1,174 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import copy + +from .position import Position +from .report import Report +from .order import Order + + +""" +rtn & earning in the Account + rtn: + from order's view + 1.change if any order is executed, sell order or buy order + 2.change at the end of today, (today_clse - stock_price) * amount + earning + from value of current position + earning will be updated at the end of trade date + earning = today_value - pre_value + **is consider cost** + while earning is the difference of two position value, so it considers cost, it is the true return rate + in the specific accomplishment for rtn, it does not consider cost, in other words, rtn - cost = earning +""" + + +class Account: + def __init__(self, init_cash, last_trade_date=None): + self.init_vars(init_cash, last_trade_date) + + def init_vars(self, init_cash, last_trade_date=None): + # init cash + self.init_cash = init_cash + self.current = Position(cash=init_cash) + self.positions = {} + self.rtn = 0 + self.ct = 0 + self.to = 0 + self.val = 0 + self.report = Report() + self.earning = 0 + self.last_trade_date = last_trade_date + + def get_positions(self): + return self.positions + + def get_cash(self): + return self.current.position["cash"] + + def update_state_from_order(self, order, trade_val, cost, trade_price): + # update cash + if order.direction == Order.SELL: # 0 for sell + self.current.position["cash"] += trade_val - cost + elif order.direction == Order.BUY: # 1 for buy + self.current.position["cash"] -= trade_val + cost + else: + raise NotImplementedError("{} ".format(order.direction)) + # update turnover + self.to += trade_val + # update cost + self.ct += cost + # update return + # update self.rtn from order + if order.direction == Order.SELL: # 0 for sell + # when sell stock, get profit from price change + profit = trade_val - self.current.get_stock_price(order.stock_id) * order.deal_amount + self.rtn += profit # note here do not consider cost + elif order.direction == Order.BUY: # 1 for buy + # when buy stock, we get return for the rtn computing method + # profit in buy order is to make self.rtn is consistent with self.earning at the end of date + profit = self.current.get_stock_price(order.stock_id) * order.deal_amount - trade_val + self.rtn += profit + + def update_order(self, order, trade_val, cost, trade_price): + # if stock is sold out, no stock price information in Position, then we should update account first, then update current position + # if stock is bought, there is no stock in current position, update current, then update account + if order.direction == Order.SELL: + # sell stock + self.update_state_from_order(order, trade_val, cost, trade_price) + # update current position + # for may sell all of stock_id + self.current.update_order(order, trade_price) + else: + # buy stock + # deal order, then update state + self.current.update_order(order, trade_price) + self.update_state_from_order(order, trade_val, cost, trade_price) + + def update_daily_end(self, today, trader): + """ + today: pd.TimeStamp + quote: pd.DataFrame (code, date), collumns + when the end of trade date + - update rtn + - update price for each asset + - update value for this account + - update earning (2nd view of return ) + - update holding day, count of stock + - update position hitory + - update report + :return: None + """ + # update price for stock in the position and the profit from changed_price + stock_list = self.current.get_stock_list() + profit = 0 + for code in stock_list: + # if suspend, no new price to be updated, profit is 0 + if trader.check_stock_suspended(code, today): + continue + else: + today_close = trader.get_close(code, today) + profit += (today_close - self.current.position[code]["price"]) * self.current.position[code]["amount"] + self.current.update_stock_price(stock_id=code, price=today_close) + self.rtn += profit + # update holding day count + self.current.add_count_all() + # update value + self.val = self.current.calculate_value() + # update earning (2nd view of return) + # account_value - last_account_value + # for the first trade date, account_value - init_cash + # self.report.is_empty() to judge is_first_trade_date + # get last_account_value, today_account_value, today_stock_value + if self.report.is_empty(): + last_account_value = self.init_cash + else: + last_account_value = self.report.get_latest_account_value() + today_account_value = self.current.calculate_value() + today_stock_value = self.current.calculate_stock_value() + self.earning = today_account_value - last_account_value + # update report for today + # judge whether the the trading is begin. + # and don't add init account state into report, due to we don't have excess return in those days. + self.report.update_report_record( + trade_date=today, + account_value=today_account_value, + cash=self.current.position["cash"], + return_rate=(self.earning + self.ct) / last_account_value, + # here use earning to calculate return, position's view, earning consider cost, true return + # in order to make same definition with original backtest in evaluate.py + turnover_rate=self.to / last_account_value, + cost_rate=self.ct / last_account_value, + stock_value=today_stock_value, + ) + # set today_account_value to position + self.current.position["today_account_value"] = today_account_value + self.current.update_weight_all() + # update positions + # note use deepcopy + self.positions[today] = copy.deepcopy(self.current) + + # finish today's updation + # reset the daily variables + self.rtn = 0 + self.ct = 0 + self.to = 0 + self.last_trade_date = today + + def load_account(self, account_path): + report = Report() + position = Position() + last_trade_date = position.load_position(account_path / "position.xlsx") + report.load_report(account_path / "report.csv") + + # assign values + self.init_vars(position.init_cash) + self.current = position + self.report = report + self.last_trade_date = last_trade_date if last_trade_date else None + + def save_account(self, account_path): + self.current.save_position(account_path / "position.xlsx", self.last_trade_date) + self.report.save_report(account_path / "report.csv") diff --git a/qlib/contrib/backtest/backtest.py b/qlib/contrib/backtest/backtest.py new file mode 100644 index 000000000..ea7220133 --- /dev/null +++ b/qlib/contrib/backtest/backtest.py @@ -0,0 +1,128 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import numpy as np +import pandas as pd +from ...utils import get_date_by_shift, get_date_range +from ..online.executor import SimulatorExecutor +from ...data import D +from .account import Account +from ...config import C +from ...log import get_module_logger + +LOG = get_module_logger("backtest") + + +def backtest(pred, strategy, trade_exchange, shift, verbose, account, benchmark): + """Parameters + ---------- + pred : pandas.DataFrame + predict should has index and one `score` column + strategy : Strategy() + strategy part for backtest + trade_exchange : Exchange() + exchage for backtest + shift : int + whether to shift prediction by one day + verbose : bool + whether to print log + account : float + init account value + benchmark : str/list/pd.Series + `benchmark` is pd.Series, `index` is trading date; the value T is the change from T-1 to T. + example: + print(D.features(D.instruments('csi500'), ['$close/Ref($close, 1)-1'])['$close/Ref($close, 1)-1'].head()) + 2017-01-04 0.011693 + 2017-01-05 0.000721 + 2017-01-06 -0.004322 + 2017-01-09 0.006874 + 2017-01-10 -0.003350 + + `benchmark` is list, will use the daily average change of the stock pool in the list as the 'bench'. + `benchmark` is str, will use the daily change as the 'bench'. + benchmark code, default is SH000905 CSI500 + """ + trade_account = Account(init_cash=account) + _pred_dates = pred.index.get_level_values(level="datetime") + predict_dates = D.calendar(start_time=_pred_dates.min(), end_time=_pred_dates.max()) + if isinstance(benchmark, pd.Series): + bench = benchmark + else: + _codes = benchmark if isinstance(benchmark, list) else [benchmark] + _temp_result = D.features( + _codes, + ["$close/Ref($close,1)-1"], + predict_dates[0], + get_date_by_shift(predict_dates[-1], shift=shift), + disk_cache=1, + ) + bench = _temp_result.groupby(level="datetime")[_temp_result.columns.tolist()[0]].mean() + + trade_dates = np.append(predict_dates[shift:], get_date_range(predict_dates[-1], shift=shift)) + executor = SimulatorExecutor(trade_exchange, verbose=verbose) + + # trading apart + for pred_date, trade_date in zip(predict_dates, trade_dates): + # for loop predict date and trading date + # print + if verbose: + LOG.info("[I {:%Y-%m-%d}]: trade begin.".format(trade_date)) + + # 1. Load the score_series at pred_date + try: + score = pred.loc(axis=0)[:, pred_date] # (stock_id, trade_date) multi_index, score in pdate + score_series = score.reset_index(level="datetime", drop=True)[ + "score" + ] # pd.Series(index:stock_id, data: score) + except KeyError: + LOG.warning("No score found on predict date[{:%Y-%m-%d}]".format(trade_date)) + score_series = None + + if score_series is not None and score_series.count() > 0: # in case of the scores are all None + # 2. Update your strategy (and model) + strategy.update(score_series, pred_date, trade_date) + + # 3. Generate order list + order_list = strategy.generate_order_list( + score_series=score_series, + current=trade_account.current, + trade_exchange=trade_exchange, + pred_date=pred_date, + trade_date=trade_date, + ) + else: + order_list = [] + # 4. Get result after executing order list + # NOTE: The following operation will modify order.amount. + # NOTE: If it is buy and the cash is insufficient, the tradable amount will be recalculated + trade_info = executor.execute(trade_account, order_list, trade_date) + + # 5. Update account information according to transaction + update_account(trade_account, trade_info, trade_exchange, trade_date) + + # generate backtest report + report_df = trade_account.report.generate_report_dataframe() + report_df["bench"] = bench + positions = trade_account.get_positions() + return report_df, positions + + +def update_account(trade_account, trade_info, trade_exchange, trade_date): + """Update the account and strategy + Parameters + ---------- + trade_account : Account() + trade_info : list of [Order(), float, float, float] + (order, trade_val, trade_cost, trade_price), trade_info with out factor + trade_exchange : Exchange() + used to get the $close_price at trade_date to update account + trade_date : pd.Timestamp + """ + # update account + for [order, trade_val, trade_cost, trade_price] in trade_info: + if order.deal_amount == 0: + continue + trade_account.update_order(order=order, trade_val=trade_val, cost=trade_cost, trade_price=trade_price) + # at the end of trade date, update the account based the $close_price of stocks. + trade_account.update_daily_end(today=trade_date, trader=trade_exchange) diff --git a/qlib/contrib/backtest/exchange.py b/qlib/contrib/backtest/exchange.py new file mode 100644 index 000000000..68a506718 --- /dev/null +++ b/qlib/contrib/backtest/exchange.py @@ -0,0 +1,430 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import random +import logging + +import numpy as np +import pandas as pd + +from ...data import D +from .order import Order +from ...config import C, REG_CN +from ...log import get_module_logger + + +class Exchange: + def __init__( + self, + trade_dates=None, + codes="all", + deal_price=None, + subscribe_fields=[], + limit_threshold=None, + open_cost=0.0015, + close_cost=0.0025, + trade_unit=None, + min_cost=5, + extra_quote=None, + ): + """__init__ + + :param trade_dates: list of pd.Timestamp + :param codes: list stock_id list or a string of instruments(i.e. all, csi500, sse50) + :param deal_price: str, 'close', 'open', 'vwap' + :param subscribe_fields: list, subscribe fields + :param limit_threshold: float, 0.1 for example, default None + :param open_cost: cost rate for open, default 0.0015 + :param close_cost: cost rate for close, default 0.0025 + :param trade_unit: trade unit, 100 for China A market + :param min_cost: min cost, default 5 + :param extra_quote: pandas, dataframe consists of + columns: like ['$vwap', '$close', '$factor', 'limit']. + The limit indicates that the etf is tradable on a specific day. + Necessary fields: + $close is for calculating the total value at end of each day. + Optional fields: + $vwap is only necessary when we use the $vwap price as the deal price + $factor is for rounding to the trading unit + limit will be set to False by default(False indicates we can buy this + target on this day). + index: MultipleIndex(instrument, pd.Datetime) + """ + if trade_unit is None: + trade_unit = C.trade_unit + if limit_threshold is None: + limit_threshold = C.limit_threshold + if deal_price is None: + deal_price = C.deal_price + + self.logger = get_module_logger("online operator", level=logging.INFO) + + self.trade_unit = trade_unit + + # TODO: the quote, trade_dates, codes are not necessray. + # It is just for performance consideration. + if limit_threshold is None: + if C.region == REG_CN: + self.logger.warning(f"limit_threshold not set. The stocks hit the limit may be bought/sold") + elif abs(limit_threshold) > 0.1: + if C.region == REG_CN: + self.logger.warning(f"limit_threshold may not be set to a reasonable value") + + if deal_price[0] != "$": + self.deal_price = "$" + deal_price + else: + self.deal_price = deal_price + if isinstance(codes, str): + codes = D.instruments(codes) + self.codes = codes + # Necessary fields + # $close is for calculating the total value at end of each day. + # $factor is for rounding to the trading unit + # $change is for calculating the limit of the stock + + necessary_fields = {self.deal_price, "$close", "$change", "$factor"} + subscribe_fields = list(necessary_fields | set(subscribe_fields)) + all_fields = list(necessary_fields | set(subscribe_fields)) + self.all_fields = all_fields + self.open_cost = open_cost + self.close_cost = close_cost + self.min_cost = min_cost + self.limit_threshold = limit_threshold + # TODO: the quote, trade_dates, codes are not necessray. + # It is just for performance consideration. + if trade_dates is not None and len(trade_dates): + start_date, end_date = trade_dates[0], trade_dates[-1] + else: + self.logger.warning("trade_dates have not been assigned, all dates will be loaded") + start_date, end_date = None, None + + self.extra_quote = extra_quote + self.set_quote(codes, start_date, end_date) + + def set_quote(self, codes, start_date, end_date): + if len(codes) == 0: + codes = D.instruments() + self.quote = D.features(codes, self.all_fields, start_date, end_date, disk_cache=True).dropna(subset=["$close"]) + self.quote.columns = self.all_fields + + if self.quote[self.deal_price].isna().any(): + self.logger.warning("{} field data contains nan.".format(self.deal_price)) + + if self.quote["$factor"].isna().any(): + # The 'factor.day.bin' file not exists, and `factor` field contains `nan` + # Use adjusted price + self.trade_w_adj_price = True + self.logger.warning("factor.day.bin file not exists or factor contains `nan`. Order using adjusted_price.") + else: + # The `factor.day.bin` file exists and all data `close` and `factor` are not `nan` + # Use normal price + self.trade_w_adj_price = False + # update limit + # check limit_threshold + if self.limit_threshold is None: + self.quote["limit"] = False + else: + # set limit + self._update_limit(buy_limit=self.limit_threshold, sell_limit=self.limit_threshold) + + quote_df = self.quote + if self.extra_quote is not None: + # process extra_quote + if "$close" not in self.extra_quote: + raise ValueError("$close is necessray in extra_quote") + if self.deal_price not in self.extra_quote.columns: + self.extra_quote[self.deal_price] = self.extra_quote["$close"] + self.logger.warning("No deal_price set for extra_quote. Use $close as deal_price.") + if "$factor" not in self.extra_quote.columns: + self.extra_quote["$factor"] = 1.0 + self.logger.warning("No $factor set for extra_quote. Use 1.0 as $factor.") + if "limit" not in self.extra_quote.columns: + self.extra_quote["limit"] = False + self.logger.warning("No limit set for extra_quote. All stock will be tradable.") + assert set(self.extra_quote.columns) == set(quote_df.columns) - {"$change"} + quote_df = pd.concat([quote_df, self.extra_quote], sort=False, axis=0) + + # update quote: pd.DataFrame to dict, for search use + self.quote = quote_df.to_dict("index") + + def _update_limit(self, buy_limit, sell_limit): + self.quote["limit"] = ~self.quote["$change"].between(-sell_limit, buy_limit) + + def check_stock_limit(self, stock_id, trade_date): + """Parameter + stock_id + trade_date + is limtited + """ + return self.quote[(stock_id, trade_date)]["limit"] + + def check_stock_suspended(self, stock_id, trade_date): + # is suspended + return (stock_id, trade_date) not in self.quote + + def is_stock_tradable(self, stock_id, trade_date): + # check if stock can be traded + # same as check in check_order + if self.check_stock_suspended(stock_id, trade_date) or self.check_stock_limit(stock_id, trade_date): + return False + else: + return True + + def check_order(self, order): + # check limit and suspended + if self.check_stock_suspended(order.stock_id, order.trade_date) or self.check_stock_limit( + order.stock_id, order.trade_date + ): + return False + else: + return True + + def deal_order(self, order, trade_account=None, position=None): + """ + Deal order when the actual transaction + + :param order: Deal the order. + :param trade_account: Trade account to be updated after dealing the order. + :param position: position to be updated after dealing the order. + :return: trade_val, trade_cost, trade_price + """ + # need to check order first + # TODO: check the order unit limit in the exchange!!!! + # The order limit is related to the adj factor and the cur_amount. + # factor = self.quote[(order.stock_id, order.trade_date)]['$factor'] + # cur_amount = trade_account.current.get_stock_amount(order.stock_id) + if self.check_order(order) is False: + raise AttributeError("need to check order first") + if trade_account is not None and position is not None: + raise ValueError("trade_account and position can only choose one") + + trade_price = self.get_deal_price(order.stock_id, order.trade_date) + trade_val, trade_cost = self._calc_trade_info_by_order( + order, trade_account.current if trade_account else position + ) + # update account + if trade_val > 0: + # If the order can only be deal 0 trade_val. Nothing to be updated + # Otherwise, it will result some stock with 0 amount in the position + if trade_account: + trade_account.update_order( + order=order, + trade_val=trade_val, + cost=trade_cost, + trade_price=trade_price, + ) + elif position: + position.update_order(order, trade_price) + + return trade_val, trade_cost, trade_price + + def get_quote_info(self, stock_id, trade_date): + return self.quote[(stock_id, trade_date)] + + def get_close(self, stock_id, trade_date): + return self.quote[(stock_id, trade_date)]["$close"] + + def get_deal_price(self, stock_id, trade_date): + deal_price = self.quote[(stock_id, trade_date)][self.deal_price] + if np.isclose(deal_price, 0.0) or np.isnan(deal_price): + self.logger.warning(f"(stock_id:{stock_id}, trade_date:{trade_date}, {self.deal_price}): {deal_price}!!!") + self.logger.warning(f"setting deal_price to close price") + deal_price = self.get_close(stock_id, trade_date) + return deal_price + + def get_factor(self, stock_id, trade_date): + return self.quote[(stock_id, trade_date)]["$factor"] + + def generate_amount_position_from_weight_position(self, weight_position, cash, trade_date): + """ + The generate the target position according to the weight and the cash. + NOTE: All the cash will assigned to the tadable stock. + + Parameter: + weight_position : dict {stock_id : weight}; allocate cash by weight_position + among then, weight must be in this range: 0 < weight < 1 + cash : cash + trade_date : trade date + """ + + # calculate the total weight of tradable value + tradable_weight = 0.0 + for stock_id in weight_position: + if self.is_stock_tradable(stock_id=stock_id, trade_date=trade_date): + # weight_position must be greater than 0 and less than 1 + if weight_position[stock_id] < 0 or weight_position[stock_id] > 1: + raise ValueError( + "weight_position is {}, " + "weight_position is not in the range of (0, 1).".format(weight_position[stock_id]) + ) + tradable_weight += weight_position[stock_id] + + if tradable_weight - 1.0 >= 1e-5: + raise ValueError("tradable_weight is {}, can not greater than 1.".format(tradable_weight)) + + amount_dict = {} + for stock_id in weight_position: + if weight_position[stock_id] > 0.0 and self.is_stock_tradable(stock_id=stock_id, trade_date=trade_date): + amount_dict[stock_id] = ( + cash + * weight_position[stock_id] + / tradable_weight + // self.get_deal_price(stock_id=stock_id, trade_date=trade_date) + ) + return amount_dict + + def get_real_deal_amount(self, current_amount, target_amount, factor): + """ + Calculate the real adjust deal amount when considering the trading unit + + :param current_amount: + :param target_amount: + :param factor: + :return real_deal_amount; Positive deal_amount indicates buying more stock. + """ + if current_amount == target_amount: + return 0 + elif current_amount < target_amount: + deal_amount = target_amount - current_amount + deal_amount = self.round_amount_by_trade_unit(deal_amount, factor) + return deal_amount + else: + if target_amount == 0: + return -current_amount + else: + deal_amount = current_amount - target_amount + deal_amount = self.round_amount_by_trade_unit(deal_amount, factor) + return -deal_amount + + def generate_order_for_target_amount_position(self, target_position, current_position, trade_date): + """Parameter: + target_position : dict { stock_id : amount } + current_postion : dict { stock_id : amount} + trade_unit : trade_unit + down sample : for amount 321 and trade_unit 100, deal_amount is 300 + deal order on trade_date + """ + # split buy and sell for further use + buy_order_list = [] + sell_order_list = [] + # three parts: kept stock_id, dropped stock_id, new stock_id + # handle kept stock_id + + # because the order of the set is not fixed, the trading order of the stock is different, so that the backtest results of the same parameter are different; + # so here we sort stock_id, and then randomly shuffle the order of stock_id + # because the same random seed is used, the final stock_id order is fixed + sorted_ids = sorted(set(list(current_position.keys()) + list(target_position.keys()))) + random.seed(0) + random.shuffle(sorted_ids) + for stock_id in sorted_ids: + + # Do not generate order for the nontradable stocks + if not self.is_stock_tradable(stock_id=stock_id, trade_date=trade_date): + continue + + target_amount = target_position.get(stock_id, 0) + current_amount = current_position.get(stock_id, 0) + factor = self.quote[(stock_id, trade_date)]["$factor"] + + deal_amount = self.get_real_deal_amount(current_amount, target_amount, factor) + if deal_amount == 0: + continue + elif deal_amount > 0: + # buy stock + buy_order_list.append( + Order( + stock_id=stock_id, + amount=deal_amount, + direction=Order.BUY, + trade_date=trade_date, + factor=factor, + ) + ) + else: + # sell stock + sell_order_list.append( + Order( + stock_id=stock_id, + amount=abs(deal_amount), + direction=Order.SELL, + trade_date=trade_date, + factor=factor, + ) + ) + # return order_list : buy + sell + return sell_order_list + buy_order_list + + def calculate_amount_position_value(self, amount_dict, trade_date, only_tradable=False): + """Parameter + position : Position() + amount_dict : {stock_id : amount} + """ + value = 0 + for stock_id in amount_dict: + if ( + self.check_stock_suspended(stock_id=stock_id, trade_date=trade_date) is False + and self.check_stock_limit(stock_id=stock_id, trade_date=trade_date) is False + ): + value += self.get_deal_price(stock_id=stock_id, trade_date=trade_date) * amount_dict[stock_id] + return value + + def round_amount_by_trade_unit(self, deal_amount, factor): + """Parameter + deal_amount : float, adjusted amount + factor : float, adjusted factor + return : float, real amount + """ + if not self.trade_w_adj_price: + # the minimal amount is 1. Add 0.1 for solving precision problem. + return (deal_amount * factor + 0.1) // self.trade_unit * self.trade_unit / factor + return deal_amount + + def _calc_trade_info_by_order(self, order, position): + """ + Calculation of trade info + + :param order: + :param position: Position + :return: trade_val, trade_cost + """ + + trade_price = self.get_deal_price(order.stock_id, order.trade_date) + if order.direction == Order.SELL: + # sell + if position is not None: + if np.isclose(order.amount, position.get_stock_amount(order.stock_id)): + # when selling last stock. The amount don't need rounding + order.deal_amount = order.amount + else: + order.deal_amount = self.round_amount_by_trade_unit(order.amount, order.factor) + else: + # TODO: We don't know current position. + # We choose to sell all + order.deal_amount = order.amount + + trade_val = order.deal_amount * trade_price + trade_cost = max(trade_val * self.close_cost, self.min_cost) + elif order.direction == Order.BUY: + # buy + if position is not None: + cash = position.get_cash() + trade_val = order.amount * trade_price + if cash < trade_val * (1 + self.open_cost): + # The money is not enough + order.deal_amount = self.round_amount_by_trade_unit( + cash / (1 + self.open_cost) / trade_price, order.factor + ) + else: + # THe money is enough + order.deal_amount = self.round_amount_by_trade_unit(order.amount, order.factor) + else: + # Unknown amount of money. Just round the amount + order.deal_amount = self.round_amount_by_trade_unit(order.amount, order.factor) + + trade_val = order.deal_amount * trade_price + trade_cost = trade_val * self.open_cost + else: + raise NotImplementedError("order type {} error".format(order.type)) + + return trade_val, trade_cost diff --git a/qlib/contrib/backtest/order.py b/qlib/contrib/backtest/order.py new file mode 100644 index 000000000..740773b2f --- /dev/null +++ b/qlib/contrib/backtest/order.py @@ -0,0 +1,29 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +class Order: + + SELL = 0 + BUY = 1 + + def __init__(self, stock_id, amount, trade_date, direction, factor): + """Parameter + direction : Order.SELL for sell; Order.BUY for buy + stock_id : str + amount : float + trade_date : pd.Timestamp + factor : float + presents the weight factor assigned in Exchange() + """ + # check direction + if direction not in {Order.SELL, Order.BUY}: + raise NotImplementedError("direction not supported, `Order.SELL` for sell, `Order.BUY` for buy") + self.stock_id = stock_id + # amount of generated orders + self.amount = amount + # amount of successfully completed orders + self.deal_amount = 0 + self.trade_date = trade_date + self.direction = direction + self.factor = factor diff --git a/qlib/contrib/backtest/position.py b/qlib/contrib/backtest/position.py new file mode 100644 index 000000000..b614c08d0 --- /dev/null +++ b/qlib/contrib/backtest/position.py @@ -0,0 +1,207 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import pandas as pd +import copy +import pathlib +from .order import Order + +""" +Position module +""" + +""" +current state of position +a typical example is :{ + : { + 'count': , + 'amount': , + 'price': , + 'weight': , + }, +} + +""" + + +class Position: + """Position""" + + def __init__(self, cash=0, position_dict={}, today_account_value=0): + # NOTE: The position dict must be copied!!! + # Otherwise the initial value + self.init_cash = cash + self.position = position_dict.copy() + self.position["cash"] = cash + self.position["today_account_value"] = today_account_value + + def init_stock(self, stock_id, amount, price=None): + self.position[stock_id] = {} + self.position[stock_id]["count"] = 0 # update count in the end of this date + self.position[stock_id]["amount"] = amount + self.position[stock_id]["price"] = price + self.position[stock_id]["weight"] = 0 # update the weight in the end of the trade date + + def buy_stock(self, stock_id, amount, price): + if stock_id not in self.position: + self.init_stock(stock_id=stock_id, amount=amount, price=price) + else: + # exist, add amount + self.position[stock_id]["amount"] += amount + + def sell_stock(self, stock_id, amount): + if stock_id not in self.position: + raise KeyError("{} not in current position".format(stock_id)) + else: + # decrease the amount of stock + self.position[stock_id]["amount"] -= amount + # check if to delete + if self.position[stock_id]["amount"] < -1e-5: + raise ValueError( + "only have {} {}, require {}".format(self.position[stock_id]["amount"], stock_id, amount) + ) + elif abs(self.position[stock_id]["amount"]) <= 1e-5: + self.del_stock(stock_id) + + def del_stock(self, stock_id): + del self.position[stock_id] + + def update_order(self, order, trade_price): + # handle order, order is a order class, defined in exchange.py + if order.direction == Order.BUY: + # BUY + self.buy_stock(stock_id=order.stock_id, amount=order.deal_amount, price=trade_price) + elif order.direction == Order.SELL: + # SELL + self.sell_stock(stock_id=order.stock_id, amount=order.deal_amount) + else: + raise NotImplementedError("do not suppotr order direction {}".format(order.direction)) + + def update_stock_price(self, stock_id, price): + self.position[stock_id]["price"] = price + + def update_stock_count(self, stock_id, count): + self.position[stock_id]["count"] = count + + def update_stock_weight(self, stock_id, weight): + self.position[stock_id]["weight"] = weight + + def update_cash(self, cash): + self.position["cash"] = cash + + def calculate_stock_value(self): + stock_list = self.get_stock_list() + value = 0 + for stock_id in stock_list: + value += self.position[stock_id]["amount"] * self.position[stock_id]["price"] + return value + + def calculate_value(self): + value = self.calculate_stock_value() + value += self.position["cash"] + return value + + def get_stock_list(self): + stock_list = list(set(self.position.keys()) - {"cash", "today_account_value"}) + return stock_list + + def get_stock_price(self, code): + return self.position[code]["price"] + + def get_stock_amount(self, code): + return self.position[code]["amount"] + + def get_stock_count(self, code): + return self.position[code]["count"] + + def get_stock_weight(self, code): + return self.position[code]["weight"] + + def get_cash(self): + return self.position["cash"] + + def get_stock_amount_dict(self): + """generate stock amount dict {stock_id : amount of stock} """ + d = {} + stock_list = self.get_stock_list() + for stock_code in stock_list: + d[stock_code] = self.get_stock_amount(code=stock_code) + return d + + def get_stock_weight_dict(self, only_stock=False): + """get_stock_weight_dict + generate stock weight fict {stock_id : value weight of stock in the position} + it is meaningful in the beginning or the end of each trade date + + :param only_stock: If only_stock=True, the weight of each stock in total stock will be returned + If only_stock=False, the weight of each stock in total assets(stock + cash) will be returned + """ + if only_stock: + position_value = self.calculate_stock_value() + else: + position_value = self.calculate_value() + d = {} + stock_list = self.get_stock_list() + for stock_code in stock_list: + d[stock_code] = self.position[stock_code]["amount"] * self.position[stock_code]["price"] / position_value + return d + + def add_count_all(self): + stock_list = self.get_stock_list() + for code in stock_list: + self.position[code]["count"] += 1 + + def update_weight_all(self): + weight_dict = self.get_stock_weight_dict() + for stock_code, weight in weight_dict.items(): + self.update_stock_weight(stock_code, weight) + + def save_position(self, path, last_trade_date): + path = pathlib.Path(path) + p = copy.deepcopy(self.position) + cash = pd.Series() + cash["init_cash"] = self.init_cash + cash["cash"] = p["cash"] + cash["today_account_value"] = p["today_account_value"] + cash["last_trade_date"] = str(last_trade_date.date()) if last_trade_date else None + del p["cash"] + del p["today_account_value"] + positions = pd.DataFrame.from_dict(p, orient="index") + with pd.ExcelWriter(path) as writer: + positions.to_excel(writer, sheet_name="position") + cash.to_excel(writer, sheet_name="info") + + def load_position(self, path): + """load position information from a file + should have format below + sheet "position" + columns: ['stock', 'count', 'amount', 'price', 'weight'] + 'count': , + 'amount': , + 'price': , + 'weight': , + + sheet "cash" + index: ['init_cash', 'cash', 'today_account_value'] + 'init_cash': , + 'cash': , + 'today_account_value': + """ + path = pathlib.Path(path) + positions = pd.read_excel(open(path, "rb"), sheet_name="position", index_col=0) + cash_record = pd.read_excel(open(path, "rb"), sheet_name="info", index_col=0) + positions = positions.to_dict(orient="index") + init_cash = cash_record.loc["init_cash"].values[0] + cash = cash_record.loc["cash"].values[0] + today_account_value = cash_record.loc["today_account_value"].values[0] + last_trade_date = cash_record.loc["last_trade_date"].values[0] + + # assign values + self.position = {} + self.init_cash = init_cash + self.position = positions + self.position["cash"] = cash + self.position["today_account_value"] = today_account_value + + return None if pd.isna(last_trade_date) else pd.Timestamp(last_trade_date) diff --git a/qlib/contrib/backtest/profit_attribution.py b/qlib/contrib/backtest/profit_attribution.py new file mode 100644 index 000000000..d51fc450e --- /dev/null +++ b/qlib/contrib/backtest/profit_attribution.py @@ -0,0 +1,324 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import numpy as np +import pandas as pd +from .position import Position +from ...data import D +from ...config import C +import datetime +from pathlib import Path + + +def get_benchmark_weight( + bench, + start_date=None, + end_date=None, + path=None, +): + """get_benchmark_weight + + get the stock weight distribution of the benchmark + + :param bench: + :param start_date: + :param end_date: + :param path: + + :return: The weight distribution of the the benchmark described by a pandas dataframe + Every row corresponds to a trading day. + Every column corresponds to a stock. + Every cell represents the strategy. + + """ + if not path: + path = Path(C.mount_path).expanduser() / "raw" / "AIndexMembers" / "weights.csv" + # TODO: the storage of weights should be implemented in a more elegent way + # TODO: The benchmark is not consistant with the filename in instruments. + bench_weight_df = pd.read_csv(path, usecols=["code", "date", "index", "weight"]) + bench_weight_df = bench_weight_df[bench_weight_df["index"] == bench] + bench_weight_df["date"] = pd.to_datetime(bench_weight_df["date"]) + if start_date is not None: + bench_weight_df = bench_weight_df[bench_weight_df.date >= start_date] + if end_date is not None: + bench_weight_df = bench_weight_df[bench_weight_df.date <= end_date] + bench_stock_weight = bench_weight_df.pivot_table(index="date", columns="code", values="weight") / 100.0 + return bench_stock_weight + + +def get_stock_weight_df(positions): + """get_stock_weight_df + :param positions: Given a positions from backtest result. + :return: A weight distribution for the position + """ + stock_weight = [] + index = [] + for date in sorted(positions.keys()): + pos = positions[date] + if isinstance(pos, dict): + pos = Position(position_dict=pos) + index.append(date) + stock_weight.append(pos.get_stock_weight_dict(only_stock=True)) + return pd.DataFrame(stock_weight, index=index) + + +def decompose_portofolio_weight(stock_weight_df, stock_group_df): + """decompose_portofolio_weight + + ''' + :param stock_weight_df: a pandas dataframe to describe the portofolio by weight. + every row corresponds to a day + every column corresponds to a stock. + Here is an example below. + code SH600004 SH600006 SH600017 SH600022 SH600026 SH600037 \ + date + 2016-01-05 0.001543 0.001570 0.002732 0.001320 0.003000 NaN + 2016-01-06 0.001538 0.001569 0.002770 0.001417 0.002945 NaN + .... + :param stock_group_df: a pandas dataframe to describe the stock group. + every row corresponds to a day + every column corresponds to a stock. + the value in the cell repreponds the group id. + Here is a example by for stock_group_df for industry. The value is the industry code + instrument SH600000 SH600004 SH600005 SH600006 SH600007 SH600008 \ + datetime + 2016-01-05 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + 2016-01-06 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + ... + :return: Two dict will be returned. The group_weight and the stock_weight_in_group. + The key is the group. The value is a Series or Dataframe to describe the weight of group or weight of stock + """ + all_group = np.unique(stock_group_df.values.flatten()) + all_group = all_group[~np.isnan(all_group)] + + group_weight = {} + stock_weight_in_group = {} + for group_key in all_group: + group_mask = stock_group_df == group_key + group_weight[group_key] = stock_weight_df[group_mask].sum(axis=1) + stock_weight_in_group[group_key] = stock_weight_df[group_mask].divide(group_weight[group_key], axis=0) + return group_weight, stock_weight_in_group + + +def decompose_portofolio(stock_weight_df, stock_group_df, stock_ret_df): + """ + :param stock_weight_df: a pandas dataframe to describe the portofolio by weight. + every row corresponds to a day + every column corresponds to a stock. + Here is an example below. + code SH600004 SH600006 SH600017 SH600022 SH600026 SH600037 \ + date + 2016-01-05 0.001543 0.001570 0.002732 0.001320 0.003000 NaN + 2016-01-06 0.001538 0.001569 0.002770 0.001417 0.002945 NaN + 2016-01-07 0.001555 0.001546 0.002772 0.001393 0.002904 NaN + 2016-01-08 0.001564 0.001527 0.002791 0.001506 0.002948 NaN + 2016-01-11 0.001597 0.001476 0.002738 0.001493 0.003043 NaN + .... + + :param stock_group_df: a pandas dataframe to describe the stock group. + every row corresponds to a day + every column corresponds to a stock. + the value in the cell repreponds the group id. + Here is a example by for stock_group_df for industry. The value is the industry code + instrument SH600000 SH600004 SH600005 SH600006 SH600007 SH600008 \ + datetime + 2016-01-05 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + 2016-01-06 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + 2016-01-07 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + 2016-01-08 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + 2016-01-11 801780.0 801170.0 801040.0 801880.0 801180.0 801160.0 + ... + + :param stock_ret_df: a pandas dataframe to describe the stock return. + every row corresponds to a day + every column corresponds to a stock. + the value in the cell repreponds the return of the group. + Here is a example by for stock_ret_df. + instrument SH600000 SH600004 SH600005 SH600006 SH600007 SH600008 \ + datetime + 2016-01-05 0.007795 0.022070 0.099099 0.024707 0.009473 0.016216 + 2016-01-06 -0.032597 -0.075205 -0.098361 -0.098985 -0.099707 -0.098936 + 2016-01-07 -0.001142 0.022544 0.100000 0.004225 0.000651 0.047226 + 2016-01-08 -0.025157 -0.047244 -0.038567 -0.098177 -0.099609 -0.074408 + 2016-01-11 0.023460 0.004959 -0.034384 0.018663 0.014461 0.010962 + ... + + :return: It will decompose the portofolio to the group weight and group return. + """ + all_group = np.unique(stock_group_df.values.flatten()) + all_group = all_group[~np.isnan(all_group)] + + group_weight, stock_weight_in_group = decompose_portofolio_weight(stock_weight_df, stock_group_df) + + group_ret = {} + for group_key in stock_weight_in_group: + stock_weight_in_group_start_date = min(stock_weight_in_group[group_key].index) + stock_weight_in_group_end_date = max(stock_weight_in_group[group_key].index) + + temp_stock_ret_df = stock_ret_df[ + (stock_ret_df.index >= stock_weight_in_group_start_date) + & (stock_ret_df.index <= stock_weight_in_group_end_date) + ] + + group_ret[group_key] = (temp_stock_ret_df * stock_weight_in_group[group_key]).sum(axis=1) + # If no weight is assigned, then the return of group will be np.nan + group_ret[group_key][group_weight[group_key] == 0.0] = np.nan + + group_weight_df = pd.DataFrame(group_weight) + group_ret_df = pd.DataFrame(group_ret) + return group_weight_df, group_ret_df + + +def get_daily_bin_group(bench_values, stock_values, group_n): + """get_daily_bin_group + Group the values of the stocks of benchmark into several bins in a day. + Put the stocks into these bins. + + :param bench_values: A series contains the value of stocks in benchmark. + The index is the stock code. + :param stock_values: A series contains the value of stocks of your portofolio + The index is the stock code. + :param group_n: Bins will be produced + + :return: A series with the same size and index as the stock_value. + The value in the series is the group id of the bins. + The No.1 bin contains the biggest values. + """ + stock_group = stock_values.copy() + + # get the bin split points based on the daily proportion of benchmark + split_points = np.percentile(bench_values[~bench_values.isna()], np.linspace(0, 100, group_n + 1)) + # Modify the biggest uppper bound and smallest lowerbound + split_points[0], split_points[-1] = -np.inf, np.inf + for i, (lb, up) in enumerate(zip(split_points, split_points[1:])): + stock_group.loc[stock_values[(stock_values >= lb) & (stock_values < up)].index] = group_n - i + return stock_group + + +def get_stock_group(stock_group_field_df, bench_stock_weight_df, group_method, group_n=None): + if group_method == "category": + # use the value of the benchmark as the category + return stock_group_field_df + elif group_method == "bins": + assert group_n is not None + # place the values into `group_n` fields. + # Each bin corresponds to a category. + new_stock_group_df = stock_group_field_df.copy().loc[ + bench_stock_weight_df.index.min() : bench_stock_weight_df.index.max() + ] + for idx, row in (~bench_stock_weight_df.isna()).iterrows(): + bench_values = stock_group_field_df.loc[idx, row[row].index] + new_stock_group_df.loc[idx] = get_daily_bin_group( + bench_values, stock_group_field_df.loc[idx], group_n=group_n + ) + return new_stock_group_df + + +def brinson_pa( + positions, + bench="SH000905", + group_field="industry", + group_method="category", + group_n=None, + deal_price="vwap", +): + """brinson profit attribution + + :param positions: The position produced by the backtest class + :param bench: The benchmark for comparing. TODO: if no benchmark is set, the equal-weighted is used. + :param group_field: The field used to set the group for assets allocation. + `industry` and `market_value` is often used. + :param group_method: 'category' or 'bins'. The method used to set the group for asstes allocation + `bin` will split the value into `group_n` bins and each bins represents a group + :param group_n: . Only used when group_method == 'bins'. + + :return: + A dataframe with three columns: RAA(excess Return of Assets Allocation), RSS(excess Return of Stock Selectino), RTotal(Total excess Return) + Every row corresponds to a trading day, the value corresponds to the next return for this trading day + The middle info of brinson profit attribution + """ + # group_method will decide how to group the group_field. + dates = sorted(positions.keys()) + + start_date, end_date = min(dates), max(dates) + + bench_stock_weight = get_benchmark_weight(bench, start_date, end_date) + + # The attributes for allocation will not + if not group_field.startswith("$"): + group_field = "$" + group_field + if not deal_price.startswith("$"): + deal_price = "$" + deal_price + + # FIXME: In current version. Some attributes(such as market_value) of some + # suspend stock is NAN. So we have to get more date to forward fill the NAN + shift_start_date = start_date - datetime.timedelta(days=250) + instruments = D.list_instruments( + D.instruments(market="all"), + start_time=shift_start_date, + end_time=end_date, + as_list=True, + ) + stock_df = D.features( + instruments, + [group_field, deal_price], + start_time=shift_start_date, + end_time=end_date, + freq="day", + ) + stock_df.columns = [group_field, "deal_price"] + + stock_group_field = stock_df[group_field].unstack().T + # FIXME: some attributes of some suspend stock is NAN. + stock_group_field = stock_group_field.fillna(method="ffill") + stock_group_field = stock_group_field.loc[start_date:end_date] + + stock_group = get_stock_group(stock_group_field, bench_stock_weight, group_method, group_n) + + deal_price_df = stock_df["deal_price"].unstack().T + deal_price_df = deal_price_df.fillna(method="ffill") + + # NOTE: + # The return will be slightly different from the of the return in the report. + # Here the position are adjusted at the end of the trading day with close + stock_ret = (deal_price_df - deal_price_df.shift(1)) / deal_price_df.shift(1) + stock_ret = stock_ret.shift(-1).loc[start_date:end_date] + + port_stock_weight_df = get_stock_weight_df(positions) + + # decomposing the portofolio + port_group_weight_df, port_group_ret_df = decompose_portofolio(port_stock_weight_df, stock_group, stock_ret) + bench_group_weight_df, bench_group_ret_df = decompose_portofolio(bench_stock_weight, stock_group, stock_ret) + + # if the group return of the portofolio is NaN, replace it with the market + # value + mod_port_group_ret_df = port_group_ret_df.copy() + mod_port_group_ret_df[mod_port_group_ret_df.isna()] = bench_group_ret_df + + Q1 = (bench_group_weight_df * bench_group_ret_df).sum(axis=1) + Q2 = (port_group_weight_df * bench_group_ret_df).sum(axis=1) + Q3 = (bench_group_weight_df * mod_port_group_ret_df).sum(axis=1) + Q4 = (port_group_weight_df * mod_port_group_ret_df).sum(axis=1) + + return ( + pd.DataFrame( + { + "RAA": Q2 - Q1, # The excess profit from the assets allocation + "RSS": Q3 - Q1, # The excess profit from the stocks selection + # The excess profit from the interaction of assets allocation and stocks selection + "RIN": Q4 - Q3 - Q2 + Q1, + "RTotal": Q4 - Q1, # The totoal excess profit + } + ), + { + "port_group_ret": port_group_ret_df, + "port_group_weight": port_group_weight_df, + "bench_group_ret": bench_group_ret_df, + "bench_group_weight": bench_group_weight_df, + "stock_group": stock_group, + "bench_stock_weight": bench_stock_weight, + "port_stock_weight": port_stock_weight_df, + "stock_ret": stock_ret, + }, + ) diff --git a/qlib/contrib/backtest/report.py b/qlib/contrib/backtest/report.py new file mode 100644 index 000000000..beb9759d0 --- /dev/null +++ b/qlib/contrib/backtest/report.py @@ -0,0 +1,106 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from collections import OrderedDict +import pandas as pd +import pathlib + + +class Report: + # daily report of the account + # contain those followings: returns, costs turnovers, accounts, cash, bench, value + # update report + def __init__(self): + self.init_vars() + + def init_vars(self): + self.accounts = OrderedDict() # account postion value for each trade date + self.returns = OrderedDict() # daily return rate for each trade date + self.turnovers = OrderedDict() # turnover for each trade date + self.costs = OrderedDict() # trade cost for each trade date + self.values = OrderedDict() # value for each trade date + self.cashes = OrderedDict() + self.latest_report_date = None # pd.TimeStamp + + def is_empty(self): + return len(self.accounts) == 0 + + def get_latest_date(self): + return self.latest_report_date + + def get_latest_account_value(self): + return self.accounts[self.latest_report_date] + + def update_report_record( + self, + trade_date=None, + account_value=None, + cash=None, + return_rate=None, + turnover_rate=None, + cost_rate=None, + stock_value=None, + ): + # check data + if None in [ + trade_date, + account_value, + cash, + return_rate, + turnover_rate, + cost_rate, + stock_value, + ]: + raise ValueError( + "None in [trade_date, account_value, cash, return_rate, turnover_rate, cost_rate, stock_value]" + ) + # update report data + self.accounts[trade_date] = account_value + self.returns[trade_date] = return_rate + self.turnovers[trade_date] = turnover_rate + self.costs[trade_date] = cost_rate + self.values[trade_date] = stock_value + self.cashes[trade_date] = cash + # update latest_report_date + self.latest_report_date = trade_date + # finish daily report update + + def generate_report_dataframe(self): + report = pd.DataFrame() + report["account"] = pd.Series(self.accounts) + report["return"] = pd.Series(self.returns) + report["turnover"] = pd.Series(self.turnovers) + report["cost"] = pd.Series(self.costs) + report["value"] = pd.Series(self.values) + report["cash"] = pd.Series(self.cashes) + report.index.name = "date" + return report + + def save_report(self, path): + r = self.generate_report_dataframe() + r.to_csv(path) + + def load_report(self, path): + """load report from a file + should have format like + columns = ['account', 'return', 'turnover', 'cost', 'value', 'cash'] + :param + path: str/ pathlib.Path() + """ + path = pathlib.Path(path) + r = pd.read_csv(open(path, "rb"), index_col=0) + r.index = pd.DatetimeIndex(r.index) + + index = r.index + self.init_vars() + for date in index: + self.update_report_record( + trade_date=date, + account_value=r.loc[date]["account"], + cash=r.loc[date]["cash"], + return_rate=r.loc[date]["return"], + turnover_rate=r.loc[date]["turnover"], + cost_rate=r.loc[date]["cost"], + stock_value=r.loc[date]["value"], + ) diff --git a/qlib/contrib/estimator/__init__.py b/qlib/contrib/estimator/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/qlib/contrib/estimator/config.py b/qlib/contrib/estimator/config.py new file mode 100644 index 000000000..5a4a31613 --- /dev/null +++ b/qlib/contrib/estimator/config.py @@ -0,0 +1,176 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import yaml +import copy +import os +import json +import tempfile +from pathlib import Path +from ...config import REG_CN + + +class EstimatorConfigManager(object): + def __init__(self, config_path): + + if not config_path: + raise ValueError("Config path is invalid.") + self.config_path = config_path + + with open(config_path) as fp: + config = yaml.load(fp, Loader=yaml.FullLoader) + self.config = copy.deepcopy(config) + + self.ex_config = ExperimentConfig(config.get("experiment", dict()), self) + self.data_config = DataConfig(config.get("data", dict()), self) + self.model_config = ModelConfig(config.get("model", dict()), self) + self.trainer_config = TrainerConfig(config.get("trainer", dict()), self) + self.strategy_config = StrategyConfig(config.get("strategy", dict()), self) + self.backtest_config = BacktestConfig(config.get("backtest", dict()), self) + self.qlib_data_config = QlibDataConfig(config.get("qlib_data", dict()), self) + + # If the start_date and end_date are not given in data_config, they will be referred from the trainer_config. + handler_start_date = self.data_config.handler_parameters.get("start_date", None) + handler_end_date = self.data_config.handler_parameters.get("end_date", None) + if handler_start_date is None: + self.data_config.handler_parameters["start_date"] = self.trainer_config.parameters["train_start_date"] + if handler_end_date is None: + self.data_config.handler_parameters["end_date"] = self.trainer_config.parameters["test_end_date"] + + +class ExperimentConfig(object): + TRAIN_MODE = "train" + TEST_MODE = "test" + + OBSERVER_FILE_STORAGE = "file_storage" + OBSERVER_MONGO = "mongo" + + def __init__(self, config, CONFIG_MANAGER): + """__init__ + + :param config: The config dict for experiment + :param CONFIG_MANAGER: The estimator config manager + """ + self.name = config.get("name", "test_experiment") + # The dir of the result of all the experiments + self.global_dir = config.get("dir", os.path.dirname(CONFIG_MANAGER.config_path)) + # The dir of the result of current experiment + self.ex_dir = os.path.join(self.global_dir, self.name) + if not os.path.exists(self.ex_dir): + os.makedirs(self.ex_dir) + self.tmp_run_dir = tempfile.mkdtemp(dir=self.ex_dir) + self.mode = config.get("mode", ExperimentConfig.TRAIN_MODE) + self.sacred_dir = os.path.join(self.ex_dir, "sacred") + self.observer_type = config.get("observer_type", ExperimentConfig.OBSERVER_FILE_STORAGE) + self.mongo_url = config.get("mongo_url", None) + self.db_name = config.get("db_name", None) + self.finetune = config.get("finetune", False) + + # The path of the experiment id of the experiment + self.exp_info_path = config.get("exp_info_path", os.path.join(self.ex_dir, "exp_info.json")) + exp_info_dir = Path(self.exp_info_path).parent + exp_info_dir.mkdir(parents=True, exist_ok=True) + + # Test mode config + loader_args = config.get("loader", dict()) + if self.mode == ExperimentConfig.TEST_MODE or self.finetune: + loader_exp_info_path = loader_args.get("exp_info_path", None) + self.loader_model_index = loader_args.get("model_index", None) + if (loader_exp_info_path is not None) and (os.path.exists(loader_exp_info_path)): + with open(loader_exp_info_path) as fp: + loader_dict = json.load(fp) + for k, v in loader_dict.items(): + setattr(self, "loader_{}".format(k), v) + # Check loader experiment id + assert hasattr(self, "loader_id"), "If mode is test or finetune is True, loader must contain id." + else: + self.loader_id = loader_args.get("id", None) + if self.loader_id is None: + raise ValueError("If mode is test or finetune is True, loader must contain id.") + + self.loader_observer_type = loader_args.get("observer_type", self.observer_type) + self.loader_name = loader_args.get("name", self.name) + self.loader_dir = loader_args.get("dir", self.global_dir) + + self.loader_mongo_url = loader_args.get("mongo_url", self.mongo_url) + self.loader_db_name = loader_args.get("db_name", self.db_name) + + +class DataConfig(object): + def __init__(self, config, CONFIG_MANAGER): + """__init__ + + :param config: The config dict for data + :param CONFIG_MANAGER: The estimator config manager + """ + self.handler_module_path = config.get("module_path", "qlib.contrib.estimator.handler") + self.handler_class = config.get("class", "ALPHA360") + self.handler_parameters = config.get("args", dict()) + self.handler_filter = config.get("filter", dict()) + # Update provider uri. + + +class ModelConfig(object): + def __init__(self, config, CONFIG_MANAGER): + """__init__ + + :param config: The config dict for model + :param CONFIG_MANAGER: The estimator config manager + """ + self.model_class = config.get("class", "Model") + self.model_module_path = config.get("module_path", "qlib.contrib.model") + self.save_dir = os.path.join(CONFIG_MANAGER.ex_config.tmp_run_dir, "model") + self.save_path = config.get("save_path", os.path.join(self.save_dir, "model.bin")) + self.parameters = config.get("args", dict()) + # Make dir if need. + if not os.path.exists(self.save_dir): + os.makedirs(self.save_dir) + + +class TrainerConfig(object): + def __init__(self, config, CONFIG_MANAGER): + """__init__ + + :param config: The config dict for trainer + :param CONFIG_MANAGER: The estimator config manager + """ + self.trainer_class = config.get("class", "StaticTrainer") + self.trainer_module_path = config.get("module_path", "qlib.contrib.estimator.trainer") + self.parameters = config.get("args", dict()) + + +class StrategyConfig(object): + def __init__(self, config, CONFIG_MANAGER): + """__init__ + + :param config: The config dict for strategy + :param CONFIG_MANAGER: The estimator config manager + """ + self.strategy_class = config.get("class", "TopkDropoutStrategy") + self.strategy_module_path = config.get("module_path", "qlib.contrib.strategy.strategy") + self.parameters = config.get("args", dict()) + + +class BacktestConfig(object): + def __init__(self, config, CONFIG_MANAGE): + """__init__ + + :param config: The config dict for strategy + :param CONFIG_MANAGE: The estimator config manager + """ + self.normal_backtest_parameters = config.get("normal_backtest_args", dict()) + self.long_short_backtest_parameters = config.get("long_short_backtest_args", dict()) + + +class QlibDataConfig(object): + def __init__(self, config, CONFIG_MANAGE): + """__init__ + + :param config: The config dict for qlib_client + :param CONFIG_MANAGE: The estimator config manager + """ + self.provider_uri = config.pop("provider_uri", "~/.qlib/qlib_data/cn_data") + self.auto_mount = config.pop("auto_mount", False) + self.mount_path = config.pop("mount_path", "~/.qlib/qlib_data/cn_data") + self.region = config.pop("region", REG_CN) + self.args = config diff --git a/qlib/contrib/estimator/estimator.py b/qlib/contrib/estimator/estimator.py new file mode 100644 index 000000000..151b2b002 --- /dev/null +++ b/qlib/contrib/estimator/estimator.py @@ -0,0 +1,323 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# coding=utf-8 + +import pandas as pd + +import os +import copy +import json +import yaml +import pickle + +import qlib +from ..evaluate import risk_analysis +from ..evaluate import backtest as normal_backtest +from ..evaluate import long_short_backtest +from .config import ExperimentConfig +from .fetcher import create_fetcher_with_config + +from ...log import get_module_logger, TimeInspector +from ...utils import get_module_by_module_path, compare_dict_value + + +class Estimator(object): + def __init__(self, config_manager, sacred_ex): + + # Set logger. + self.logger = get_module_logger("Estimator") + + # 1. Set config manager. + self.config_manager = config_manager + + # 2. Set configs. + self.ex_config = config_manager.ex_config + self.data_config = config_manager.data_config + self.model_config = config_manager.model_config + self.trainer_config = config_manager.trainer_config + self.strategy_config = config_manager.strategy_config + self.backtest_config = config_manager.backtest_config + + # If experiment.mode is test or experiment.finetune is True, load the experimental results in the loader + if self.ex_config.mode == self.ex_config.TEST_MODE or self.ex_config.finetune: + self.compare_config_with_config_manger(self.config_manager) + + # 3. Set sacred_experiment. + self.ex = sacred_ex + + # 4. Init data handler. + self.data_handler = None + self._init_data_handler() + + # 5. Init trainer. + self.trainer = None + self._init_trainer() + + # 6. Init strategy. + self.strategy = None + self._init_strategy() + + def _init_data_handler(self): + handler_module = get_module_by_module_path(self.data_config.handler_module_path) + + # Set market + market = self.data_config.handler_filter.get("market", None) + if market is None: + if "market" in self.data_config.handler_parameters: + self.logger.warning( + "Warning: The market in data.args section is deprecated. " + "It only works when market is not set in data.filter section. " + "It will be overridden by market in the data.filter section." + ) + market = self.data_config.handler_parameters["market"] + else: + market = "csi500" + + self.data_config.handler_parameters["market"] = market + + data_filter_list = [] + handler_filters = self.data_config.handler_filter.get("filter_pipeline", list()) + for h_filter in handler_filters: + filter_module_path = h_filter.get("module_path", "qlib.data.filter") + filter_class_name = h_filter.get("class", "") + filter_parameters = h_filter.get("args", {}) + filter_module = get_module_by_module_path(filter_module_path) + filter_class = getattr(filter_module, filter_class_name) + data_filter = filter_class(**filter_parameters) + data_filter_list.append(data_filter) + + self.data_config.handler_parameters["data_filter_list"] = data_filter_list + handler_class = getattr(handler_module, self.data_config.handler_class) + self.data_handler = handler_class(**self.data_config.handler_parameters) + + def _init_trainer(self): + + model_module = get_module_by_module_path(self.model_config.model_module_path) + trainer_module = get_module_by_module_path(self.trainer_config.trainer_module_path) + model_class = getattr(model_module, self.model_config.model_class) + trainer_class = getattr(trainer_module, self.trainer_config.trainer_class) + + self.trainer = trainer_class( + model_class, + self.model_config.save_path, + self.model_config.parameters, + self.data_handler, + self.ex, + **self.trainer_config.parameters + ) + + def _init_strategy(self): + + module = get_module_by_module_path(self.strategy_config.strategy_module_path) + strategy_class = getattr(module, self.strategy_config.strategy_class) + self.strategy = strategy_class(**self.strategy_config.parameters) + + def run(self): + if self.ex_config.mode == ExperimentConfig.TRAIN_MODE: + self.trainer.train() + elif self.ex_config.mode == ExperimentConfig.TEST_MODE: + self.trainer.load() + else: + raise ValueError("unexpected mode: %s" % self.ex_config.mode) + analysis = self.backtest() + self.logger.info(analysis) + self.logger.info( + "experiment id: {}, experiment name: {}".format(self.ex.experiment.current_run._id, self.ex_config.name) + ) + + # Remove temp dir + # shutil.rmtree(self.ex_config.tmp_run_dir) + + def backtest(self): + TimeInspector.set_time_mark() + # 1. Get pred and prediction score of model(s). + pred = self.trainer.get_test_score() + performance = self.trainer.get_test_performance() + # 2. Normal Backtest. + report_normal, positions_normal = self._normal_backtest(pred) + # 3. Long-Short Backtest. + # Deprecated + # long_short_reports = self._long_short_backtest(pred) + # 4. Analyze + analysis_df = self._analyze(report_normal) + # 5. Save. + self._save_backtest_result( + pred, + analysis_df, + positions_normal, + report_normal, + # long_short_reports, + performance, + ) + return analysis_df + + def _normal_backtest(self, pred): + TimeInspector.set_time_mark() + if "account" not in self.backtest_config.normal_backtest_parameters: + if "account" in self.strategy_config.parameters: + self.logger.warning( + "Warning: The account in strategy section is deprecated. " + "It only works when account is not set in backtest section. " + "It will be overridden by account in the backtest section." + ) + self.backtest_config.normal_backtest_parameters["account"] = self.strategy_config.parameters["account"] + report_normal, positions_normal = normal_backtest( + pred, strategy=self.strategy, **self.backtest_config.normal_backtest_parameters + ) + TimeInspector.log_cost_time("Finished normal backtest.") + return report_normal, positions_normal + + def _long_short_backtest(self, pred): + TimeInspector.set_time_mark() + long_short_reports = long_short_backtest(pred, **self.backtest_config.long_short_backtest_parameters) + TimeInspector.log_cost_time("Finished long-short backtest.") + return long_short_reports + + @staticmethod + def _analyze(report_normal): + TimeInspector.set_time_mark() + + analysis = dict() + # analysis["pred_long"] = risk_analysis(long_short_reports["long"]) + # analysis["pred_short"] = risk_analysis(long_short_reports["short"]) + # analysis["pred_long_short"] = risk_analysis(long_short_reports["long_short"]) + analysis["sub_bench"] = risk_analysis(report_normal["return"] - report_normal["bench"]) + analysis["sub_cost"] = risk_analysis(report_normal["return"] - report_normal["bench"] - report_normal["cost"]) + analysis_df = pd.concat(analysis) # type: pd.DataFrame + TimeInspector.log_cost_time( + "Finished generating analysis," " average turnover is: {0:.4f}.".format(report_normal["turnover"].mean()) + ) + return analysis_df + + def _save_backtest_result(self, pred, analysis, positions, report_normal, performance): + # 1. Result dir. + result_dir = os.path.join(self.config_manager.ex_config.tmp_run_dir, "result") + if not os.path.exists(result_dir): + os.makedirs(result_dir) + + self.ex.add_info( + "task_config", + json.loads(json.dumps(self.config_manager.config, default=str)), + ) + + # 2. Pred. + TimeInspector.set_time_mark() + pred_pkl_path = os.path.join(result_dir, "pred.pkl") + pred.to_pickle(pred_pkl_path) + self.ex.add_artifact(pred_pkl_path) + TimeInspector.log_cost_time("Finished saving pred.pkl to: {}".format(pred_pkl_path)) + + # 3. Ana. + TimeInspector.set_time_mark() + analysis_pkl_path = os.path.join(result_dir, "analysis.pkl") + analysis.to_pickle(analysis_pkl_path) + self.ex.add_artifact(analysis_pkl_path) + TimeInspector.log_cost_time("Finished saving analysis.pkl to: {}".format(analysis_pkl_path)) + + # 4. Pos. + TimeInspector.set_time_mark() + positions_pkl_path = os.path.join(result_dir, "positions.pkl") + with open(positions_pkl_path, "wb") as fp: + pickle.dump(positions, fp) + self.ex.add_artifact(positions_pkl_path) + TimeInspector.log_cost_time("Finished saving positions.pkl to: {}".format(positions_pkl_path)) + + # 5. Report normal. + TimeInspector.set_time_mark() + report_normal_pkl_path = os.path.join(result_dir, "report_normal.pkl") + report_normal.to_pickle(report_normal_pkl_path) + self.ex.add_artifact(report_normal_pkl_path) + TimeInspector.log_cost_time("Finished saving report_normal.pkl to: {}".format(report_normal_pkl_path)) + + # 6. Report long short. + # Deprecated + # for k, name in zip( + # ["long", "short", "long_short"], + # ["report_long.pkl", "report_short.pkl", "report_long_short.pkl"], + # ): + # TimeInspector.set_time_mark() + # pkl_path = os.path.join(result_dir, name) + # long_short_reports[k].to_pickle(pkl_path) + # self.ex.add_artifact(pkl_path) + # TimeInspector.log_cost_time("Finished saving {} to: {}".format(name, pkl_path)) + + # 7. Origin test label. + TimeInspector.set_time_mark() + label_pkl_path = os.path.join(result_dir, "label.pkl") + self.data_handler.get_origin_test_label_with_date( + self.trainer_config.parameters["test_start_date"], + self.trainer_config.parameters["test_end_date"], + ).to_pickle(label_pkl_path) + self.ex.add_artifact(label_pkl_path) + TimeInspector.log_cost_time("Finished saving label.pkl to: {}".format(label_pkl_path)) + + # 8. Experiment info, save the model(s) performance here. + TimeInspector.set_time_mark() + cur_ex_id = self.ex.experiment.current_run._id + exp_info = { + "id": cur_ex_id, + "name": self.ex_config.name, + "performance": performance, + "observer_type": self.ex_config.observer_type, + } + + if self.ex_config.observer_type == ExperimentConfig.OBSERVER_MONGO: + exp_info.update( + { + "mongo_url": self.ex_config.mongo_url, + "db_name": self.ex_config.db_name, + } + ) + else: + exp_info.update({"dir": self.ex_config.global_dir}) + + with open(self.ex_config.exp_info_path, "w") as fp: + json.dump(exp_info, fp, indent=4, sort_keys=True) + self.ex.add_artifact(self.ex_config.exp_info_path) + TimeInspector.log_cost_time("Finished saving ex_info to: {}".format(self.ex_config.exp_info_path)) + + @staticmethod + def compare_config_with_config_manger(config_manager): + """Compare loader model args and current config with ConfigManage + + :param config_manager: ConfigManager + :return: + """ + fetcher = create_fetcher_with_config(config_manager, load_form_loader=True) + loader_mode_config = fetcher.get_experiment( + exp_name=config_manager.ex_config.loader_name, + exp_id=config_manager.ex_config.loader_id, + fields=["task_config"], + )["task_config"] + with open(config_manager.config_path) as fp: + current_config = yaml.load(fp.read()) + current_config = json.loads(json.dumps(current_config, default=str)) + + logger = get_module_logger("Estimator") + + loader_mode_config = copy.deepcopy(loader_mode_config) + current_config = copy.deepcopy(current_config) + + # Require test_mode_config.test_start_date <= current_config.test_start_date + loader_trainer_args = loader_mode_config.get("trainer", {}).get("args", {}) + cur_trainer_args = current_config.get("trainer", {}).get("args", {}) + loader_start_date = loader_trainer_args.pop("test_start_date") + cur_test_start_date = cur_trainer_args.pop("test_start_date") + assert ( + loader_start_date <= cur_test_start_date + ), "Require: loader_mode_config.test_start_date <= current_config.test_start_date" + + # TODO: For the user's own extended `Trainer`, the support is not very good + if "RollingTrainer" == current_config.get("trainer", {}).get("class", None): + loader_period = loader_trainer_args.pop("rolling_period") + cur_period = cur_trainer_args.pop("rolling_period") + assert ( + loader_period == cur_period + ), "Require: loader_mode_config.rolling_period == current_config.rolling_period" + + compare_section = ["trainer", "model", "data"] + for section in compare_section: + changes = compare_dict_value(loader_mode_config.get(section, {}), current_config.get(section, {})) + if changes: + logger.warning("Warning: Loader mode config and current config, `{}` are different:\n".format(section)) diff --git a/qlib/contrib/estimator/fetcher.py b/qlib/contrib/estimator/fetcher.py new file mode 100644 index 000000000..16ef1dc60 --- /dev/null +++ b/qlib/contrib/estimator/fetcher.py @@ -0,0 +1,290 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# coding=utf-8 + +import copy +import json +import yaml +import pickle +import gridfs +import pymongo +from pathlib import Path +from abc import abstractmethod + +from .config import EstimatorConfigManager, ExperimentConfig + + +class Fetcher(object): + """Sacred Experiments Fetcher""" + + @abstractmethod + def _get_experiment(self, exp_name, exp_id): + """Get experiment basic info with experiment and experiment id + + :param exp_name: experiment name + :param exp_id: experiment id + :return: dict + Must contain keys: _id, experiment, info, stop_time. + Here is an example below for FileFetcher. + exp = { + '_id': exp_id, # experiment id + 'path': path, # experiment result path + 'experiment': {'name': exp_name}, # experiment + 'info': info, # experiment config info + 'stop_time': run.get('stop_time', None) # The time the experiment ended + } + + """ + pass + + @abstractmethod + def _list_experiments(self, exp_name=None): + """Get experiment basic info list with experiment name + + :param exp_name: experiment name + :return: list + + """ + pass + + @abstractmethod + def _iter_artifacts(self, experiment): + """Get information about the data in the experiment results + + :param experiment: `self._get_experiment` method result + :return: iterable + Each element contains two elements. + first element : data name + second element : data uri + """ + pass + + @abstractmethod + def _load_data(self, uri): + """Load data with uri + + :param uri: data uri + :return: bytes + """ + pass + + @staticmethod + def model_dict_to_buffer_list(model_dict): + """ + + :param model_dict: + :return: + """ + model_list = [] + is_static_model = False + if len(model_dict) == 1 and list(model_dict.keys())[0] == "model.bin": + is_static_model = True + model_list.append(list(model_dict.values())[0]) + else: + sep = "model.bin_" + model_ids = list(map(lambda x: int(x.split(sep)[1]), model_dict.keys())) + min_id, max_id = min(model_ids), max(model_ids) + for i in range(min_id, max_id + 1): + model_key = sep + str(i) + model = model_dict.get(model_key, None) + if model is None: + print( + "WARNING: In Fetcher, {} is missing when the get model is in the get_experiment function.".format( + model_key + ) + ) + break + else: + model_list.append(model) + + if is_static_model: + return model_list[0] + + return model_list + + def get_experiments(self, exp_name=None): + """Get experiments with name. + + :param exp_name: str + If `exp_name` is set to None, then all experiments will return. + :return: dict + Experiments info dict(Including experiment id and task_config to run the + experiment). Here is an example below. + { + 'a_experiment': [ + { + 'id': '1', + 'task_config': {...} + }, + ... + ] + ... + } + """ + res = dict() + for ex in self._list_experiments(exp_name): + name = ex["experiment"]["name"] + tmp = { + "id": ex["_id"], + "task_config": ex["info"].get("task_config", {}), + "ex_run_stop_time": ex.get("stop_time", None), + } + res.setdefault(name, []).append(tmp) + return res + + def get_experiment(self, exp_name, exp_id, fields=None): + """ + + :param exp_name: + :param exp_id: + :param fields: list + Experiment result fields, if fields is None, will get all fields. + Currently supported fields: + ['model', 'analysis', 'positions', 'report_normal', 'pred', 'task_config', 'label'] + :return: dict + """ + fields = copy.copy(fields) + ex = self._get_experiment(exp_name, exp_id) + results = dict() + model_dict = dict() + for name, uri in self._iter_artifacts(ex): + # When saving, use `sacred.experiment.add_artifact(filename)` , so `name` is os.path.basename(filename) + prefix = name.split(".")[0] + if fields and prefix not in fields: + continue + data = self._load_data(uri) + if prefix == "model": + model_dict[name] = data + else: + results[prefix] = pickle.loads(data) + # Sort model + if model_dict: + results["model"] = self.model_dict_to_buffer_list(model_dict) + + # Info + results["task_config"] = ex["info"].get("task_config", {}) + return results + + def estimator_config_to_dict(self, exp_name, exp_id): + """Save configuration to file + + :param exp_name: + :param exp_id: + :return: config dict + """ + + return self.get_experiment(exp_name, exp_id, fields=["task_config"])["task_config"] + + +class FileFetcher(Fetcher): + """File Fetcher""" + + def __init__(self, experiments_dir): + self.experiments_dir = Path(experiments_dir) + + def _get_experiment(self, exp_name, exp_id): + path = self.experiments_dir / exp_name / "sacred" / str(exp_id) + info_path = path / "info.json" + run_path = path / "run.json" + + if info_path.exists(): + with info_path.open("r") as f: + info = json.load(f) + else: + info = {} + + if run_path.exists(): + with run_path.open("r") as f: + run = json.load(f) + else: + run = {} + + exp = { + "_id": exp_id, + "path": path, + "experiment": {"name": exp_name}, + "info": info, + "stop_time": run.get("stop_time", None), + } + return exp + + def _list_experiments(self, exp_name=None): + runs = [] + for path in self.experiments_dir.glob("{}/sacred/[!_]*".format(exp_name or "*")): + exp_name, exp_id = path.parents[1].name, path.name + runs.append(self._get_experiment(exp_name, exp_id)) + return runs + + def _iter_artifacts(self, experiment): + if experiment is None: + return [] + + for fname in experiment["path"].iterdir(): + if fname.suffix == ".pkl" or ".bin" in fname.suffix: + name, uri = fname.name, str(fname) + yield name, uri + + def _load_data(self, uri): + with open(uri, "rb") as f: + data = f.read() + return data + + +class MongoFetcher(Fetcher): + """MongoDB Fetcher""" + + def __init__(self, mongo_url, db_name): + self.mongo_url = mongo_url + self.db_name = db_name + self.client = None + self.db = None + self.runs = None + self.fs = None + self._setup_mongo_client() + + def _setup_mongo_client(self): + self.client = pymongo.MongoClient(self.mongo_url) + self.db = self.client[self.db_name] + self.runs = self.db.runs + self.fs = gridfs.GridFS(self.db) + + def _get_experiment(self, exp_name, exp_id): + return self.runs.find_one({"_id": exp_id}) + + def _list_experiments(self, exp_name=None): + if exp_name is None: + return self.runs.find() + return self.runs.find({"experiment.name": exp_name}) + + def _iter_artifacts(self, experiment): + if experiment is None: + return [] + for artifact in experiment.get("artifacts", []): + name, uri = artifact["name"], artifact["file_id"] + yield name, uri + + def _load_data(self, uri): + data = self.fs.get(uri).read() + return data + + +def create_fetcher_with_config(config_manager: EstimatorConfigManager, load_form_loader: bool = False): + """Create fetcher with loader config + + :param config_manager: + :param load_form_loader + :return: + """ + flag = "" + if load_form_loader: + flag = "loader_" + if config_manager.ex_config.observer_type == ExperimentConfig.OBSERVER_FILE_STORAGE: + return FileFetcher(eval("config_manager.ex_config.{}_dir".format("loader" if load_form_loader else "global"))) + elif config_manager.ex_config.observer_type == ExperimentConfig.OBSERVER_MONGO: + return MongoFetcher( + mongo_url=eval("config_manager.ex_config.{}mongo_url".format(flag)), + db_name=eval("config_manager.ex_config.{}db_name".format(flag)), + ) + else: + return NotImplementedError("Unkown Backend") diff --git a/qlib/contrib/estimator/handler.py b/qlib/contrib/estimator/handler.py new file mode 100644 index 000000000..37f5c4c3c --- /dev/null +++ b/qlib/contrib/estimator/handler.py @@ -0,0 +1,585 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# coding=utf-8 +import abc +import bisect +import logging + +import pandas as pd +import numpy as np + +from ...log import get_module_logger, TimeInspector +from ...data import D +from ...utils import parse_config, transform_end_date + +from . import processor as processor_module + + +class BaseDataHandler(abc.ABC): + def __init__(self, processors=[], **kwargs): + """ + :param start_date: + :param end_date: + :param kwargs: + """ + # Set logger + self.logger = get_module_logger("DataHandler") + + # init data using kwargs + self._init_kwargs(**kwargs) + + # Setup data. + self.raw_df, self.feature_names, self.label_names = self._init_raw_df() + + # Setup preprocessor + self.processors = [] + for klass in processors: + if isinstance(klass, str): + try: + klass = getattr(processor_module, klass) + except: + raise ValueError("unknown Processor %s" % klass) + self.processors.append(klass(self.feature_names, self.label_names, **kwargs)) + + def _init_kwargs(self, **kwargs): + """ + init the kwargs of DataHandler + """ + pass + + def _init_raw_df(self): + """ + init raw_df, feature_names, label_names of DataHandler + if the index of df_feature and df_label are not same, user need to overload this method to merge (e.g. inner, left, right merge). + + """ + df_features = self.setup_feature() + feature_names = df_features.columns + + df_labels = self.setup_label() + label_names = df_labels.columns + + raw_df = df_features.merge(df_labels, left_index=True, right_index=True, how="left") + + return raw_df, feature_names, label_names + + def reset_label(self, df_labels): + for col in self.label_names: + del self.raw_df[col] + self.label_names = df_labels.columns + self.raw_df = self.raw_df.merge(df_labels, left_index=True, right_index=True, how="left") + + def split_rolling_periods( + self, + train_start_date, + train_end_date, + validate_start_date, + validate_end_date, + test_start_date, + test_end_date, + rolling_period, + calendar_freq="day", + ): + """ + Calculating the Rolling split periods, the period rolling on market calendar. + :param train_start_date: + :param train_end_date: + :param validate_start_date: + :param validate_end_date: + :param test_start_date: + :param test_end_date: + :param rolling_period: The market period of rolling + :param calendar_freq: The frequence of the market calendar + :yield: Rolling split periods + """ + + def get_start_index(calendar, start_date): + start_index = bisect.bisect_left(calendar, start_date) + return start_index + + def get_end_index(calendar, end_date): + end_index = bisect.bisect_right(calendar, end_date) + return end_index - 1 + + calendar = self.raw_df.index.get_level_values("datetime").unique() + + train_start_index = get_start_index(calendar, pd.Timestamp(train_start_date)) + train_end_index = get_end_index(calendar, pd.Timestamp(train_end_date)) + valid_start_index = get_start_index(calendar, pd.Timestamp(validate_start_date)) + valid_end_index = get_end_index(calendar, pd.Timestamp(validate_end_date)) + test_start_index = get_start_index(calendar, pd.Timestamp(test_start_date)) + test_end_index = test_start_index + rolling_period - 1 + + need_stop_split = False + + bound_test_end_index = get_end_index(calendar, pd.Timestamp(test_end_date)) + + while not need_stop_split: + + if test_end_index > bound_test_end_index: + test_end_index = bound_test_end_index + need_stop_split = True + + yield ( + calendar[train_start_index], + calendar[train_end_index], + calendar[valid_start_index], + calendar[valid_end_index], + calendar[test_start_index], + calendar[test_end_index], + ) + + train_start_index += rolling_period + train_end_index += rolling_period + valid_start_index += rolling_period + valid_end_index += rolling_period + test_start_index += rolling_period + test_end_index += rolling_period + + def get_rolling_data( + self, + train_start_date, + train_end_date, + validate_start_date, + validate_end_date, + test_start_date, + test_end_date, + rolling_period, + calendar_freq="day", + ): + # Set generator. + for period in self.split_rolling_periods( + train_start_date, + train_end_date, + validate_start_date, + validate_end_date, + test_start_date, + test_end_date, + rolling_period, + calendar_freq, + ): + ( + x_train, + y_train, + x_validate, + y_validate, + x_test, + y_test, + ) = self.get_split_data(*period) + yield x_train, y_train, x_validate, y_validate, x_test, y_test + + def get_split_data( + self, + train_start_date, + train_end_date, + validate_start_date, + validate_end_date, + test_start_date, + test_end_date, + ): + """ + all return types are DataFrame + """ + ## TODO: loc can be slow, expecially when we put it at the second level index. + if self.raw_df.index.names[0] == "instrument": + df_train = self.raw_df.loc(axis=0)[:, train_start_date:train_end_date] + df_validate = self.raw_df.loc(axis=0)[:, validate_start_date:validate_end_date] + df_test = self.raw_df.loc(axis=0)[:, test_start_date:test_end_date] + else: + df_train = self.raw_df.loc[train_start_date:train_end_date] + df_validate = self.raw_df.loc[validate_start_date:validate_end_date] + df_test = self.raw_df.loc[test_start_date:test_end_date] + + TimeInspector.set_time_mark() + df_train, df_validate, df_test = self.setup_process_data(df_train, df_validate, df_test) + TimeInspector.log_cost_time("Finished setup processed data.") + + x_train = df_train[self.feature_names] + y_train = df_train[self.label_names] + + x_validate = df_validate[self.feature_names] + y_validate = df_validate[self.label_names] + + x_test = df_test[self.feature_names] + y_test = df_test[self.label_names] + + return x_train, y_train, x_validate, y_validate, x_test, y_test + + def setup_process_data(self, df_train, df_valid, df_test): + """ + process the train, valid and test data + :return: the processed train, valid and test data. + """ + for processor in self.processors: + df_train, df_valid, df_test = processor(df_train, df_valid, df_test) + return df_train, df_valid, df_test + + def get_origin_test_label_with_date(self, test_start_date, test_end_date, freq="day"): + """Get origin test label + + :param test_start_date: test start date + :param test_end_date: test end date + :param freq: freq + :return: pd.DataFrame + """ + test_end_date = transform_end_date(test_end_date, freq=freq) + return self.raw_df.loc[(slice(None), slice(test_start_date, test_end_date)), self.label_names] + + @abc.abstractmethod + def setup_feature(self): + """ + Implement this method to load raw feature. + the format of the feature is below + return: df_features + """ + pass + + @abc.abstractmethod + def setup_label(self): + """ + Implement this method to load and calculate label. + the format of the label is below + + return: df_label + """ + pass + + +class QLibDataHandler(BaseDataHandler): + def __init__(self, start_date, end_date, *args, **kwargs): + # Dates. + self.start_date = start_date + self.end_date = end_date + super().__init__(*args, **kwargs) + + def _init_kwargs(self, **kwargs): + + # Instruments + instruments = kwargs.get("instruments", None) + if instruments is None: + market = kwargs.get("market", "csi500").lower() + data_filter_list = kwargs.get("data_filter_list", list()) + self.instruments = D.instruments(market, filter_pipe=data_filter_list) + else: + self.instruments = instruments + + # Config of features and labels + self._fields = kwargs.get("fields", []) + self._names = kwargs.get("names", []) + self._labels = kwargs.get("labels", []) + self._label_names = kwargs.get("label_names", []) + + # Check arguments + assert len(self._fields) > 0, "features list is empty" + assert len(self._labels) > 0, "labels list is empty" + + # Check end_date + # If test_end_date is -1 or greater than the last date, the last date is used + self.end_date = transform_end_date(self.end_date) + + def setup_feature(self): + """ + Load the raw data. + return: df_features + """ + TimeInspector.set_time_mark() + + if len(self._names) == 0: + names = ["F%d" % i for i in range(len(self._fields))] + else: + names = self._names + + df_features = D.features(self.instruments, self._fields, self.start_date, self.end_date) + df_features.columns = names + + TimeInspector.log_cost_time("Finished loading features.") + + return df_features + + def setup_label(self): + """ + Build up labels in df through users' method + :return: df_labels + """ + TimeInspector.set_time_mark() + + if len(self._label_names) == 0: + label_names = ["LABEL%d" % i for i in range(len(self._labels))] + else: + label_names = self._label_names + + df_labels = D.features(self.instruments, self._labels, self.start_date, self.end_date) + df_labels.columns = label_names + + TimeInspector.log_cost_time("Finished loading labels.") + + return df_labels + + +def parse_config_to_fields(config): + """create factors from config + + config = { + 'kbar': {}, # whether to use some hard-code kbar features + 'price': { # whether to use raw price features + 'windows': [0, 1, 2, 3, 4], # use price at n days ago + 'feature': ['OPEN', 'HIGH', 'LOW'] # which price field to use + }, + 'volume': { # whether to use raw volume features + 'windows': [0, 1, 2, 3, 4], # use volume at n days ago + }, + 'rolling': { # whether to use rolling operator based features + 'windows': [5, 10, 20, 30, 60], # rolling windows size + 'include': ['ROC', 'MA', 'STD'], # rolling operator to use + #if include is None we will use default operators + 'exclude': ['RANK'], # rolling operator not to use + } + } + """ + fields = [] + names = [] + if "kbar" in config: + fields += [ + "($close-$open)/$open", + "($high-$low)/$open", + "($close-$open)/($high-$low+1e-12)", + "($high-Greater($open, $close))/$open", + "($high-Greater($open, $close))/($high-$low+1e-12)", + "(Less($open, $close)-$low)/$open", + "(Less($open, $close)-$low)/($high-$low+1e-12)", + "(2*$close-$high-$low)/$open", + "(2*$close-$high-$low)/($high-$low+1e-12)", + ] + names += [ + "KMID", + "KLEN", + "KMID2", + "KUP", + "KUP2", + "KLOW", + "KLOW2", + "KSFT", + "KSFT2", + ] + if "price" in config: + windows = config["price"].get("windows", range(5)) + feature = config["price"].get("feature", ["OPEN", "HIGH", "LOW", "CLOSE", "VWAP"]) + for field in feature: + field = field.lower() + fields += ["Ref($%s, %d)/$close" % (field, d) if d != 0 else "$%s/$close" % field for d in windows] + names += [field.upper() + str(d) for d in windows] + if "volume" in config: + windows = config["volume"].get("windows", range(5)) + fields += ["Ref($volume, %d)/$volume" % d if d != 0 else "$volume/$volume" for d in windows] + names += ["VOLUME" + str(d) for d in windows] + if "rolling" in config: + windows = config["rolling"].get("windows", [5, 10, 20, 30, 60]) + include = config["rolling"].get("include", None) + exclude = config["rolling"].get("exclude", []) + # `exclude` in dataset config unnecessary filed + # `include` in dataset config necessary field + use = lambda x: x not in exclude and (include is None or x in include) + if use("ROC"): + fields += ["Ref($close, %d)/$close" % d for d in windows] + names += ["ROC%d" % d for d in windows] + if use("MA"): + fields += ["Mean($close, %d)/$close" % d for d in windows] + names += ["MA%d" % d for d in windows] + if use("STD"): + fields += ["Std($close, %d)/$close" % d for d in windows] + names += ["STD%d" % d for d in windows] + if use("BETA"): + fields += ["Slope($close, %d)/$close" % d for d in windows] + names += ["BETA%d" % d for d in windows] + if use("RSQR"): + fields += ["Rsquare($close, %d)" % d for d in windows] + names += ["RSQR%d" % d for d in windows] + if use("RESI"): + fields += ["Resi($close, %d)/$close" % d for d in windows] + names += ["RESI%d" % d for d in windows] + if use("MAX"): + fields += ["Max($high, %d)/$close" % d for d in windows] + names += ["MAX%d" % d for d in windows] + if use("LOW"): + fields += ["Min($low, %d)/$close" % d for d in windows] + names += ["MIN%d" % d for d in windows] + if use("QTLU"): + fields += ["Quantile($close, %d, 0.8)/$close" % d for d in windows] + names += ["QTLU%d" % d for d in windows] + if use("QTLD"): + fields += ["Quantile($close, %d, 0.2)/$close" % d for d in windows] + names += ["QTLD%d" % d for d in windows] + if use("RANK"): + fields += ["Rank($close, %d)" % d for d in windows] + names += ["RANK%d" % d for d in windows] + if use("RSV"): + fields += ["($close-Min($low, %d))/(Max($high, %d)-Min($low, %d)+1e-12)" % (d, d, d) for d in windows] + names += ["RSV%d" % d for d in windows] + if use("IMAX"): + fields += ["IdxMax($high, %d)/%d" % (d, d) for d in windows] + names += ["IMAX%d" % d for d in windows] + if use("IMIN"): + fields += ["IdxMin($low, %d)/%d" % (d, d) for d in windows] + names += ["IMIN%d" % d for d in windows] + if use("IMXD"): + fields += ["(IdxMax($high, %d)-IdxMin($low, %d))/%d" % (d, d, d) for d in windows] + names += ["IMXD%d" % d for d in windows] + if use("CORR"): + fields += ["Corr($close, Log($volume+1), %d)" % d for d in windows] + names += ["CORR%d" % d for d in windows] + if use("CORD"): + fields += ["Corr($close/Ref($close,1), Log($volume/Ref($volume, 1)+1), %d)" % d for d in windows] + names += ["CORD%d" % d for d in windows] + if use("CNTP"): + fields += ["Mean($close>Ref($close, 1), %d)" % d for d in windows] + names += ["CNTP%d" % d for d in windows] + if use("CNTN"): + fields += ["Mean($closeRef($close, 1), %d)-Mean($close= -3, -3 - (x + 3).div(x.min() + 3) * 0.5, inplace=True) + if self.fillna_feature: + x.fillna(0, inplace=True) + return x + + TimeInspector.set_time_mark() + + # Copy + df_new = df.copy() + + # Label + cols = df.columns[df.columns.str.contains("^LABEL")] + df_new[cols] = df[cols].groupby(level="datetime").apply(_label_norm) + + # Features + cols = df.columns[df.columns.str.contains("^KLEN|^KLOW|^KUP")] + df_new[cols] = df[cols].apply(lambda x: x ** 0.25).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^KLOW2|^KUP2")] + df_new[cols] = df[cols].apply(lambda x: x ** 0.5).groupby(level="datetime").apply(_feature_norm) + + _cols = [ + "KMID", + "KSFT", + "OPEN", + "HIGH", + "LOW", + "CLOSE", + "VWAP", + "ROC", + "MA", + "BETA", + "RESI", + "QTLU", + "QTLD", + "RSV", + "SUMP", + "SUMN", + "SUMD", + "VSUMP", + "VSUMN", + "VSUMD", + ] + pat = "|".join(["^" + x for x in _cols]) + cols = df.columns[df.columns.str.contains(pat) & (~df.columns.isin(["HIGH0", "LOW0"]))] + df_new[cols] = df[cols].groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^STD|^VOLUME|^VMA|^VSTD")] + df_new[cols] = df[cols].apply(np.log).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^RSQR")] + df_new[cols] = df[cols].fillna(0).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^MAX|^HIGH0")] + df_new[cols] = df[cols].apply(lambda x: (x - 1) ** 0.5).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^MIN|^LOW0")] + df_new[cols] = df[cols].apply(lambda x: (1 - x) ** 0.5).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^CORR|^CORD")] + df_new[cols] = df[cols].apply(np.exp).groupby(level="datetime").apply(_feature_norm) + + cols = df.columns[df.columns.str.contains("^WVMA")] + df_new[cols] = df[cols].apply(np.log1p).groupby(level="datetime").apply(_feature_norm) + + TimeInspector.log_cost_time("Finished preprocessing data.") + + return df_new diff --git a/qlib/contrib/estimator/trainer.py b/qlib/contrib/estimator/trainer.py new file mode 100644 index 000000000..d19051de9 --- /dev/null +++ b/qlib/contrib/estimator/trainer.py @@ -0,0 +1,315 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# coding=utf-8 + +from abc import abstractmethod + +import pandas as pd +import numpy as np +from scipy.stats import pearsonr + +from ...log import get_module_logger, TimeInspector +from .handler import BaseDataHandler +from .launcher import CONFIG_MANAGER +from .fetcher import create_fetcher_with_config +from ...utils import drop_nan_by_y_index, transform_end_date + + +class BaseTrainer(object): + def __init__(self, model_class, model_save_path, model_args, data_handler: BaseDataHandler, sacred_ex, **kwargs): + # 1. Model. + self.model_class = model_class + self.model_save_path = model_save_path + self.model_args = model_args + + # 2. Data handler. + self.data_handler = data_handler + + # 3. Sacred ex. + self.ex = sacred_ex + + # 4. Logger. + self.logger = get_module_logger("Trainer") + + # 5. Data time + self.train_start_date = kwargs.get("train_start_date", None) + self.train_end_date = kwargs.get("train_end_date", None) + self.validate_start_date = kwargs.get("validate_start_date", None) + self.validate_end_date = kwargs.get("validate_end_date", None) + self.test_start_date = kwargs.get("test_start_date", None) + self.test_end_date = transform_end_date(kwargs.get("test_end_date", None)) + + @abstractmethod + def train(self): + """ + Implement this method indicating how to train a model. + """ + pass + + @abstractmethod + def load(self): + """ + Implement this method indicating how to restore a model and the data. + """ + pass + + @abstractmethod + def get_test_pred(self): + """ + Implement this method indicating how to get prediction result(s) from a model. + """ + pass + + @abstractmethod + def get_test_performance(self): + """ + Implement this method indicating how to get the performance of the model. + """ + pass + + def get_test_score(self): + """ + Override this method to transfer the predict result(s) into the score of the stock. + Note: If this is a multi-label training, you need to transfer predict labels into one score. + Or you can just use the result of `get_test_pred()` (you can also process the result) if this is one label training. + We use the first column of the result of `get_test_pred()` as default method (regard it as one label training). + """ + pred = self.get_test_pred() + pred_score = pd.DataFrame(index=pred.index) + pred_score["score"] = pred.iloc(axis=1)[0] + return pred_score + + +class StaticTrainer(BaseTrainer): + def __init__(self, model_class, model_save_path, model_args, data_handler, sacred_ex, **kwargs): + super(StaticTrainer, self).__init__(model_class, model_save_path, model_args, data_handler, sacred_ex, **kwargs) + self.model = None + + split_data = self.data_handler.get_split_data( + self.train_start_date, + self.train_end_date, + self.validate_start_date, + self.validate_end_date, + self.test_start_date, + self.test_end_date, + ) + ( + self.x_train, + self.y_train, + self.x_validate, + self.y_validate, + self.x_test, + self.y_test, + ) = split_data + + def train(self): + TimeInspector.set_time_mark() + model = self.model_class(**self.model_args) + + if CONFIG_MANAGER.ex_config.finetune: + fetcher = create_fetcher_with_config(CONFIG_MANAGER, load_form_loader=True) + loader_model = fetcher.get_experiment( + exp_name=CONFIG_MANAGER.ex_config.loader_name, + exp_id=CONFIG_MANAGER.ex_config.loader_id, + fields=["model"], + )["model"] + + if isinstance(loader_model, list): + model_index = ( + -1 + if CONFIG_MANAGER.ex_config.loader_model_index is None + else CONFIG_MANAGER.ex_config.loader_model_index + ) + loader_model = loader_model[model_index] + + model.load(loader_model) + model.finetune(self.x_train, self.y_train, self.x_validate, self.y_validate) + else: + model.fit(self.x_train, self.y_train, self.x_validate, self.y_validate) + model.save(self.model_save_path) + self.ex.add_artifact(self.model_save_path) + self.model = model + TimeInspector.log_cost_time("Finished training model.") + + def load(self): + model = self.model_class(**self.model_args) + + # Load model + fetcher = create_fetcher_with_config(CONFIG_MANAGER, load_form_loader=True) + loader_model = fetcher.get_experiment( + exp_name=CONFIG_MANAGER.ex_config.loader_name, + exp_id=CONFIG_MANAGER.ex_config.loader_id, + fields=["model"], + )["model"] + + if isinstance(loader_model, list): + model_index = ( + -1 + if CONFIG_MANAGER.ex_config.loader_model_index is None + else CONFIG_MANAGER.ex_config.loader_model_index + ) + loader_model = loader_model[model_index] + + model.load(loader_model) + + # Save model, after load, if you don't save the model, the result of this experiment will be no model + model.save(self.model_save_path) + self.ex.add_artifact(self.model_save_path) + self.model = model + + def get_test_pred(self): + pred = self.model.predict(self.x_test) + pred = pd.DataFrame(pred, index=self.x_test.index, columns=self.y_test.columns) + return pred + + def get_test_performance(self): + model_score = self.model.score(self.x_test, self.y_test) + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, __ = drop_nan_by_y_index(self.x_test, self.y_test) + pred_test = self.model.predict(x_test) + model_pearsonr = pearsonr(np.ravel(pred_test), np.ravel(y_test.values))[0] + + performance = {"model_score": model_score, "model_pearsonr": model_pearsonr} + return performance + + +class RollingTrainer(BaseTrainer): + def __init__(self, model_class, model_save_path, model_args, data_handler, sacred_ex, **kwargs): + super(RollingTrainer, self).__init__( + model_class, model_save_path, model_args, data_handler, sacred_ex, **kwargs + ) + self.rolling_period = kwargs.get("rolling_period", 60) + self.models = [] + self.rolling_data = [] + self.all_x_test = [] + self.all_y_test = [] + for data in self.data_handler.get_rolling_data( + self.train_start_date, + self.train_end_date, + self.validate_start_date, + self.validate_end_date, + self.test_start_date, + self.test_end_date, + self.rolling_period, + ): + self.rolling_data.append(data) + __, __, __, __, x_test, y_test = data + self.all_x_test.append(x_test) + self.all_y_test.append(y_test) + + def train(self): + # 1. Get total data parts. + # total_data_parts = self.data_handler.total_data_parts + # self.logger.warning('Total numbers of model are: {}, start training models...'.format(total_data_parts)) + if CONFIG_MANAGER.ex_config.finetune: + fetcher = create_fetcher_with_config(CONFIG_MANAGER, load_form_loader=True) + loader_model = fetcher.get_experiment( + exp_name=CONFIG_MANAGER.ex_config.loader_name, + exp_id=CONFIG_MANAGER.ex_config.loader_id, + fields=["model"], + )["model"] + loader_model_index = CONFIG_MANAGER.ex_config.loader_model_index + previous_model_path = "" + # 2. Rolling train. + for ( + index, + (x_train, y_train, x_validate, y_validate, x_test, y_test), + ) in enumerate(self.rolling_data): + TimeInspector.set_time_mark() + model = self.model_class(**self.model_args) + + if CONFIG_MANAGER.ex_config.finetune: + # Finetune model + if loader_model_index is None and isinstance(loader_model, list): + try: + model.load(loader_model[index]) + except IndexError: + # Load model by previous_model_path + with open(previous_model_path, "rb") as fp: + model.load(fp) + model.finetune(x_train, y_train, x_validate, y_validate) + else: + + if index == 0: + loader_model = ( + loader_model[loader_model_index] if isinstance(loader_model, list) else loader_model + ) + model.load(loader_model) + else: + with open(previous_model_path, "rb") as fp: + model.load(fp) + + model.finetune(x_train, y_train, x_validate, y_validate) + + else: + model.fit(x_train, y_train, x_validate, y_validate) + + model_save_path = "{}_{}".format(self.model_save_path, index) + model.save(model_save_path) + previous_model_path = model_save_path + self.ex.add_artifact(model_save_path) + self.models.append(model) + TimeInspector.log_cost_time("Finished training model: {}.".format(index + 1)) + + def load(self): + """ + Load the data and the model + """ + fetcher = create_fetcher_with_config(CONFIG_MANAGER, load_form_loader=True) + loader_model = fetcher.get_experiment( + exp_name=CONFIG_MANAGER.ex_config.loader_name, + exp_id=CONFIG_MANAGER.ex_config.loader_id, + fields=["model"], + )["model"] + for index in range(len(self.all_x_test)): + model = self.model_class(**self.model_args) + + model.load(loader_model[index]) + + # Save model + model_save_path = "{}_{}".format(self.model_save_path, index) + model.save(model_save_path) + self.ex.add_artifact(model_save_path) + + self.models.append(model) + + def get_test_pred(self): + """ + Predict the score on test data with the models. + Please ensure the models and data are loaded before call this score. + + :return: the predicted scores for the pred + """ + pred_df_list = [] + y_test_columns = self.all_y_test[0].columns + # Start iteration. + for model, x_test in zip(self.models, self.all_x_test): + pred = model.predict(x_test) + pred_df = pd.DataFrame(pred, index=x_test.index, columns=y_test_columns) + pred_df_list.append(pred_df) + return pd.concat(pred_df_list) + + def get_test_performance(self): + """ + Get the performances of the models + + :return: the performances of models + """ + pred_test_list = [] + y_test_list = [] + scorer = self.models[0]._scorer + for model, x_test, y_test in zip(self.models, self.all_x_test, self.all_y_test): + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, __ = drop_nan_by_y_index(x_test, y_test) + pred_test_list.append(model.predict(x_test)) + y_test_list.append(np.squeeze(y_test.values)) + + pred_test_array = np.concatenate(pred_test_list, axis=0) + y_test_array = np.concatenate(y_test_list, axis=0) + + model_score = scorer(y_test_array, pred_test_array) + model_pearsonr = pearsonr(np.ravel(y_test_array), np.ravel(pred_test_array))[0] + + performance = {"model_score": model_score, "model_pearsonr": model_pearsonr} + return performance diff --git a/qlib/contrib/evaluate.py b/qlib/contrib/evaluate.py new file mode 100644 index 000000000..d6149531c --- /dev/null +++ b/qlib/contrib/evaluate.py @@ -0,0 +1,396 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from __future__ import division +from __future__ import print_function + +import numpy as np +import pandas as pd +import inspect +from ..log import get_module_logger +from . import strategy as strategy_pool +from .strategy.strategy import BaseStrategy +from .backtest.exchange import Exchange +from .backtest.backtest import backtest as backtest_func, get_date_range + +from ..data import D +from ..config import C + +logger = get_module_logger("Evaluate") + + +def risk_analysis(r, N=252): + """Risk Analysis + + Parameters + ---------- + r : pandas.Series + daily return series + N: int + scaler for annualizing sharpe ratio (day: 250, week: 50, month: 12) + """ + mean = r.mean() + std = r.std(ddof=1) + annual = mean * N + sharpe = mean / std * np.sqrt(N) + mdd = (r.cumsum() - r.cumsum().cummax()).min() + data = {"mean": mean, "std": std, "annual": annual, "sharpe": sharpe, "mdd": mdd} + res = pd.Series(data, index=data.keys()).to_frame("risk") + return res + + +def get_strategy( + strategy=None, + topk=50, + margin=0.5, + n_drop=5, + risk_degree=0.95, + str_type="amount", + adjust_dates=None, +): + """get_strategy + + Parameters + ---------- + + strategy : Strategy() + strategy used in backtest + topk : int (Default value: 50) + top-N stocks to buy. + margin : int or float(Default value: 0.5) + if isinstance(margin, int): + sell_limit = margin + else: + sell_limit = pred_in_a_day.count() * margin + buffer margin, in single score_mode, continue holding stock if it is in nlargest(sell_limit) + sell_limit should be no less than topk + n_drop : int + number of stocks to be replaced in each trading date + risk_degree: float + 0-1, 0.95 for example, use 95% money to trade + str_type: 'amount', 'weight' or 'dropout' + strategy type: TopkAmountStrategy ,TopkWeightStrategy or TopkDropoutStrategy + + Returns + ------- + :class: Strategy + an initialized strategy object + """ + if strategy is None: + str_cls_dict = { + "amount": "TopkAmountStrategy", + "weight": "TopkWeightStrategy", + "dropout": "TopkDropoutStrategy", + } + logger.info("Create new streategy ") + str_cls = getattr(strategy_pool, str_cls_dict.get(str_type)) + strategy = str_cls( + topk=topk, + buffer_margin=margin, + n_drop=n_drop, + risk_degree=risk_degree, + adjust_dates=adjust_dates, + ) + if not isinstance(strategy, BaseStrategy): + raise TypeError("Strategy not supported") + return strategy + + +def get_exchange( + pred, + exchange=None, + subscribe_fields=[], + open_cost=0.0015, + close_cost=0.0025, + min_cost=5.0, + trade_unit=None, + limit_threshold=None, + deal_price=None, + extract_codes=False, + shift=1, +): + """get_exchange + + Parameters + ---------- + + # exchange related arguments + exchange: Exchange() + subscribe_fields: list + subscribe fields + open_cost : float + open transaction cost + close_cost : float + close transaction cost + min_cost : float + min transaction cost + trade_unit : int + 100 for China A + deal_price: str + dealing price type: 'close', 'open', 'vwap' + limit_threshold : float + limit move 0.1 (10%) for example, long and short with same limit + extract_codes: bool + will we pass the codes extracted from the pred to the exchange. + NOTE: This will be faster with offline qlib. + + Returns + ------- + :class: Exchange + an initialized Exchange object + """ + + if trade_unit is None: + trade_unit = C.trade_unit + if limit_threshold is None: + limit_threshold = C.limit_threshold + if deal_price is None: + deal_price = C.deal_price + if exchange is None: + logger.info("Create new exchange") + # handle exception for deal_price + if deal_price[0] != "$": + deal_price = "$" + deal_price + if extract_codes: + codes = sorted(pred.index.get_level_values(0).unique()) + else: + codes = "all" # TODO: We must ensure that 'all.txt' includes all the stocks + + dates = sorted(pred.index.get_level_values(1).unique()) + dates = np.append(dates, get_date_range(dates[-1], shift=shift)) + + exchange = Exchange( + trade_dates=dates, + codes=codes, + deal_price=deal_price, + subscribe_fields=subscribe_fields, + limit_threshold=limit_threshold, + open_cost=open_cost, + close_cost=close_cost, + min_cost=min_cost, + trade_unit=trade_unit, + ) + return exchange + + +# This is the API for compatibility for legacy code +def backtest(pred, account=1e9, shift=1, benchmark="SH000905", verbose=True, **kwargs): + """This function will help you set a reasonable Exchange and provide default value for strategy + Parameters + ---------- + + # backtest workflow related or commmon arguments + pred : pandas.DataFrame + predict should has index and one `score` column + account : float + init account value + shift : int + whether to shift prediction by one day + benchmark : str + benchmark code, default is SH000905 CSI 500 + verbose : bool + whether to print log + + # strategy related arguments + strategy : Strategy() + strategy used in backtest + topk : int (Default value: 50) + top-N stocks to buy. + margin : int or float(Default value: 0.5) + if isinstance(margin, int): + sell_limit = margin + else: + sell_limit = pred_in_a_day.count() * margin + buffer margin, in single score_mode, continue holding stock if it is in nlargest(sell_limit) + sell_limit should be no less than topk + n_drop : int + number of stocks to be replaced in each trading date + risk_degree: float + 0-1, 0.95 for example, use 95% money to trade + str_type: 'amount', 'weight' or 'dropout' + strategy type: TopkAmountStrategy ,TopkWeightStrategy or TopkDropoutStrategy + + # exchange related arguments + exchange: Exchange() + pass the exchange for speeding up. + subscribe_fields: list + subscribe fields + open_cost : float + open transaction cost. The default value is 0.002(0.2%). + close_cost : float + close transaction cost. The default value is 0.002(0.2%). + min_cost : float + min transaction cost + trade_unit : int + 100 for China A + deal_price: str + dealing price type: 'close', 'open', 'vwap' + limit_threshold : float + limit move 0.1 (10%) for example, long and short with same limit + extract_codes: bool + will we pass the codes extracted from the pred to the exchange. + + .. note:: This will be faster with offline qlib. + """ + # check strategy: + spec = inspect.getfullargspec(get_strategy) + str_args = {k: v for k, v in kwargs.items() if k in spec.args} + strategy = get_strategy(**str_args) + + # init exchange: + spec = inspect.getfullargspec(get_exchange) + ex_args = {k: v for k, v in kwargs.items() if k in spec.args} + trade_exchange = get_exchange(pred, **ex_args) + + # run backtest + report_df, positions = backtest_func( + pred=pred, + strategy=strategy, + trade_exchange=trade_exchange, + shift=shift, + verbose=verbose, + account=account, + benchmark=benchmark, + ) + # for compatibility of the old API. return the dict positions + positions = {k: p.position for k, p in positions.items()} + return report_df, positions + + +def long_short_backtest( + pred, + topk=50, + deal_price=None, + shift=1, + open_cost=0, + close_cost=0, + trade_unit=None, + limit_threshold=None, + min_cost=5, + subscribe_fields=[], + extract_codes=False, +): + """ + A backtest for long-short strategy + + :param pred: The trading signal produced on day `T` + :param topk: The short topk securities and long topk securities + :param deal_price: The price to deal the trading + :param shift: Whether to shift prediction by one day. The trading day will be T+1 if shift==1. + :param open_cost: open transaction cost + :param close_cost: close transaction cost + :param trade_unit: 100 for China A + :param limit_threshold: limit move 0.1 (10%) for example, long and short with same limit + :param min_cost: min transaction cost + :param subscribe_fields: subscribe fields + :param extract_codes: bool + will we pass the codes extracted from the pred to the exchange. + NOTE: This will be faster with offline qlib. + :return: The result of backtest, it is represented by a dict. + { "long": long_returns(excess), + "short": short_returns(excess), + "long_short": long_short_returns} + """ + + if trade_unit is None: + trade_unit = C.trade_unit + if limit_threshold is None: + limit_threshold = C.limit_threshold + if deal_price is None: + deal_price = C.deal_price + if deal_price[0] != "$": + deal_price = "$" + deal_price + + subscribe_fields = subscribe_fields.copy() + profit_str = f"Ref({deal_price}, -1)/{deal_price} - 1" + subscribe_fields.append(profit_str) + + trade_exchange = get_exchange( + pred=pred, + deal_price=deal_price, + subscribe_fields=subscribe_fields, + limit_threshold=limit_threshold, + open_cost=open_cost, + close_cost=close_cost, + min_cost=min_cost, + trade_unit=trade_unit, + extract_codes=extract_codes, + shift=shift, + ) + + _pred_dates = pred.index.get_level_values(level="datetime") + predict_dates = D.calendar(start_time=_pred_dates.min(), end_time=_pred_dates.max()) + trade_dates = np.append(predict_dates[shift:], get_date_range(predict_dates[-1], shift=shift)) + + long_returns = {} + short_returns = {} + ls_returns = {} + + for pdate, date in zip(predict_dates, trade_dates): + score = pred.loc(axis=0)[:, pdate] + score = score.reset_index().sort_values(by="score", ascending=False) + + long_stocks = list(score.iloc[:topk]["instrument"]) + short_stocks = list(score.iloc[-topk:]["instrument"]) + + score = score.set_index(["instrument", "datetime"]).sort_index() + + long_profit = [] + short_profit = [] + all_profit = [] + + for stock in long_stocks: + if not trade_exchange.is_stock_tradable(stock_id=stock, trade_date=date): + continue + profit = trade_exchange.get_quote_info(stock_id=stock, trade_date=date)[profit_str] + if np.isnan(profit): + long_profit.append(0) + else: + long_profit.append(profit) + + for stock in short_stocks: + if not trade_exchange.is_stock_tradable(stock_id=stock, trade_date=date): + continue + profit = trade_exchange.get_quote_info(stock_id=stock, trade_date=date)[profit_str] + if np.isnan(profit): + short_profit.append(0) + else: + short_profit.append(-profit) + + for stock in list(score.loc(axis=0)[:, pdate].index.get_level_values(level=0)): + # exclude the suspend stock + if trade_exchange.check_stock_suspended(stock_id=stock, trade_date=date): + continue + profit = trade_exchange.get_quote_info(stock_id=stock, trade_date=date)[profit_str] + if np.isnan(profit): + all_profit.append(0) + else: + all_profit.append(profit) + + long_returns[date] = np.mean(long_profit) - np.mean(all_profit) + short_returns[date] = np.mean(short_profit) + np.mean(all_profit) + ls_returns[date] = np.mean(short_profit) + np.mean(long_profit) + + return dict( + zip( + ["long", "short", "long_short"], + map(pd.Series, [long_returns, short_returns, ls_returns]), + ) + ) + + +def t_run(): + pred_FN = "./check_pred.csv" + pred = pd.read_csv(pred_FN) + pred["datetime"] = pd.to_datetime(pred["datetime"]) + pred = pred.set_index([pred.columns[0], pred.columns[1]]) + pred = pred.iloc[:9000] + report_df, positions = backtest(pred=pred) + print(report_df.head()) + print(positions.keys()) + print(positions[list(positions.keys())[0]]) + return 0 + + +if __name__ == "__main__": + t_run() diff --git a/qlib/contrib/evaluate_portfolio.py b/qlib/contrib/evaluate_portfolio.py new file mode 100644 index 000000000..04ddd8db0 --- /dev/null +++ b/qlib/contrib/evaluate_portfolio.py @@ -0,0 +1,246 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import copy +import numpy as np +import pandas as pd +from scipy.stats import spearmanr, pearsonr + + +from ..data import D + +from collections import OrderedDict + + +def _get_position_value_from_df(evaluate_date, position, close_data_df): + """Get position value by existed close data df + close_data_df: + pd.DataFrame + multi-index + close_data_df['$close'][stock_id][evaluate_date]: close price for (stock_id, evaluate_date) + position: + same in get_position_value() + """ + value = 0 + for stock_id, report in position.items(): + if stock_id != "cash": + value += report["amount"] * close_data_df["$close"][stock_id][evaluate_date] + # value += report['amount'] * report['price'] + if "cash" in position: + value += position["cash"] + return value + + +def get_position_value(evaluate_date, position): + """sum of close*amount + + get value of postion + + use close price + + postions: + { + Timestamp('2016-01-05 00:00:00'): + { + 'SH600022': + { + 'amount':100.00, + 'price':12.00 + }, + + 'cash':100000.0 + } + } + + It means Hold 100.0 'SH600022' and 100000.0 RMB in '2016-01-05' + """ + # load close price for position + # position should also consider cash + instruments = list(position.keys()) + instruments = list(set(instruments) - set(["cash"])) # filter 'cash' + fields = ["$close"] + close_data_df = D.features( + instruments, + fields, + start_time=evaluate_date, + end_time=evaluate_date, + freq="day", + disk_cache=0, + ) + value = _get_position_value_from_df(evaluate_date, position, close_data_df) + return value + + +def get_position_list_value(positions): + # generate instrument list and date for whole poitions + instruments = set() + for day, position in positions.items(): + instruments.update(position.keys()) + instruments = list(set(instruments) - set(["cash"])) # filter 'cash' + instruments.sort() + day_list = list(positions.keys()) + day_list.sort() + start_date, end_date = day_list[0], day_list[-1] + # load data + fields = ["$close"] + close_data_df = D.features( + instruments, + fields, + start_time=start_date, + end_time=end_date, + freq="day", + disk_cache=0, + ) + # generate value + # return dict for time:position_value + value_dict = OrderedDict() + for day, position in positions.items(): + value = _get_position_value_from_df(evaluate_date=day, position=position, close_data_df=close_data_df) + value_dict[day] = value + return value_dict + + +def get_daily_return_series_from_positions(positions, init_asset_value): + """Parameters + generate daily return series from position view + positions: positions generated by strategy + init_asset_value : init asset value + return: pd.Series of daily return , return_series[date] = daily return rate + """ + value_dict = get_position_list_value(positions) + value_series = pd.Series(value_dict) + value_series = value_series.sort_index() # check date + return_series = value_series.pct_change() + return_series[value_series.index[0]] = ( + value_series[value_series.index[0]] / init_asset_value - 1 + ) # update daily return for the first date + return return_series + + +def get_annual_return_from_positions(positions, init_asset_value): + """Annualized Returns + + p_r = (p_end / p_start)^{(250/n)} - 1 + + p_r annual return + p_end final value + p_start init value + n days of backtest + + """ + date_range_list = sorted(list(positions.keys())) + end_time = date_range_list[-1] + p_end = get_position_value(end_time, positions[end_time]) + p_start = init_asset_value + n_period = len(date_range_list) + annual = pow((p_end / p_start), (250 / n_period)) - 1 + + return annual + + +def get_annaul_return_from_return_series(r, method="ci"): + """Risk Analysis from daily return series + + Parameters + ---------- + r : pandas.Series + daily return series + method : str + interest calculation method, ci(compound interest)/si(simple interest) + """ + mean = r.mean() + annual = (1 + mean) ** 250 - 1 if method == "ci" else mean * 250 + + return annual + + +def get_sharpe_ratio_from_return_series(r, risk_free_rate=0.00, method="ci"): + """Risk Analysis + + Parameters + ---------- + r : pandas.Series + daily return series + method : str + interest calculation method, ci(compound interest)/si(simple interest) + risk_free_rate : float + risk_free_rate, default as 0.00, can set as 0.03 etc + """ + std = r.std(ddof=1) + annual = get_annaul_return_from_return_series(r, method=method) + sharpe = (annual - risk_free_rate) / std / np.sqrt(250) + + return sharpe + + +def get_max_drawdown_from_series(r): + """Risk Analysis from asset value + + cumprod way + + Parameters + ---------- + r : pandas.Series + daily return series + """ + # mdd = ((r.cumsum() - r.cumsum().cummax()) / (1 + r.cumsum().cummax())).min() + + mdd = (((1 + r).cumprod() - (1 + r).cumprod().cummax()) / ((1 + r).cumprod().cummax())).min() + + return mdd + + +def get_turnover_rate(): + # in backtest + pass + + +def get_beta(r, b): + """Risk Analysis beta + + Parameters + ---------- + r : pandas.Series + daily return series of strategy + b : pandas.Series + daily return series of baseline + """ + cov_r_b = np.cov(r, b) + var_b = np.var(b) + return cov_r_b / var_b + + +def get_alpha(r, b, risk_free_rate=0.03): + beta = get_beta(r, b) + annaul_r = get_annaul_return_from_return_series(r) + annaul_b = get_annaul_return_from_return_series(b) + + alpha = annaul_r - risk_free_rate - beta * (annaul_b - risk_free_rate) + + return alpha + + +def get_volatility_from_series(r): + return r.std(ddof=1) + + +def get_rank_ic(a, b): + """Rank IC + + Parameters + ---------- + r : pandas.Series + daily score series of feature + b : pandas.Series + daily return series + + """ + return spearmanr(a, b).correlation + + +def get_normal_ic(a, b): + return pearsonr(a, b).correlation diff --git a/qlib/contrib/model/__init__.py b/qlib/contrib/model/__init__.py new file mode 100644 index 000000000..c639b57f5 --- /dev/null +++ b/qlib/contrib/model/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import warnings + +from .base import Model diff --git a/qlib/contrib/model/base.py b/qlib/contrib/model/base.py new file mode 100644 index 000000000..b3ea917a5 --- /dev/null +++ b/qlib/contrib/model/base.py @@ -0,0 +1,155 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import abc +import six + + +@six.add_metaclass(abc.ABCMeta) +class Model(object): + """Model base class""" + + @property + def name(self): + return type(self).__name__ + + def fit(self, x_train, y_train, x_valid, y_valid, w_train=None, w_valid=None, **kwargs): + """fix train with cross-validation + Fit model when ex_config.finetune is False + + Parameters + ---------- + x_train : pd.dataframe + train data + y_train : pd.dataframe + train label + x_valid : pd.dataframe + valid data + y_valid : pd.dataframe + valid label + w_train : pd.dataframe + train weight + w_valid : pd.dataframe + valid weight + + Returns + ---------- + Model + trained model + """ + raise NotImplementedError() + + def score(self, x_test, y_test, w_test=None, **kwargs): + """evaluate model with test data/label + + Parameters + ---------- + x_test : pd.dataframe + test data + y_test : pd.dataframe + test label + w_test : pd.dataframe + test weight + + Returns + ---------- + float + evaluation score + """ + raise NotImplementedError() + + def predict(self, x_test, **kwargs): + """predict given test data + + Parameters + ---------- + x_test : pd.dataframe + test data + + Returns + ---------- + np.ndarray + test predict label + """ + raise NotImplementedError() + + def save(self, fname, **kwargs): + """save model + + Parameters + ---------- + fname : str + model filename + """ + # TODO: Currently need to save the model as a single file, otherwise the estimator may not be compatible + raise NotImplementedError() + + def load(self, buffer, **kwargs): + """load model + + Parameters + ---------- + buffer : bytes + binary data of model parameters + + Returns + ---------- + Model + loaded model + """ + raise NotImplementedError() + + def get_data_with_date(self, date, **kwargs): + """ + Will be called in online module + need to return the data that used to predict the label (score) of stocks at date. + + :param + date: pd.Timestamp + predict date + :return: + data: the input data that used to predict the label (score) of stocks at predict date. + """ + raise NotImplementedError("get_data_with_date for this model is not implemented.") + + def finetune(self, x_train, y_train, x_valid, y_valid, w_train=None, w_valid=None, **kwargs): + """Finetune model + In `RollingTrainer`: + if loader.model_index is None: + If provide 'Static Model', based on the provided 'Static' model update. + If provide 'Rolling Model', skip the model of load, based on the last 'provided model' update. + + if loader.model_index is not None: + Based on the provided model(loader.model_index) update. + + In `StaticTrainer`: + If the load is 'static model': + Based on the 'static model' update + If the load is 'rolling model': + Based on the provided model(`loader.model_index`) update. If `loader.model_index` is None, use the last model. + + Parameters + ---------- + x_train : pd.dataframe + train data + y_train : pd.dataframe + train label + x_valid : pd.dataframe + valid data + y_valid : pd.dataframe + valid label + w_train : pd.dataframe + train weight + w_valid : pd.dataframe + valid weight + + Returns + ---------- + Model + finetune model + """ + raise NotImplementedError("Finetune for this model is not implemented.") diff --git a/qlib/contrib/model/gbdt.py b/qlib/contrib/model/gbdt.py new file mode 100644 index 000000000..61b902995 --- /dev/null +++ b/qlib/contrib/model/gbdt.py @@ -0,0 +1,91 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import numpy as np +import lightgbm as lgb +from sklearn.metrics import roc_auc_score, mean_squared_error + +from .base import Model +from ...utils import drop_nan_by_y_index + + +class LGBModel(Model): + """LightGBM Model + + Parameters + ---------- + param_update : dict + training parameters + """ + + _params = dict() + + def __init__(self, loss="mse", **kwargs): + if loss not in {"mse", "binary"}: + raise NotImplementedError + self._scorer = mean_squared_error if loss == "mse" else roc_auc_score + self._params.update(objective=loss, **kwargs) + self._model = None + + def fit( + self, + x_train, + y_train, + x_valid, + y_valid, + w_train=None, + w_valid=None, + num_boost_round=1000, + early_stopping_rounds=50, + verbose_eval=20, + evals_result=dict(), + **kwargs + ): + # Lightgbm need 1D array as its label + if y_train.values.ndim == 2 and y_train.values.shape[1] == 1: + y_train_1d, y_valid_1d = np.squeeze(y_train.values), np.squeeze(y_valid.values) + else: + raise ValueError("LightGBM doesn't support multi-label training") + + w_train_weight = None if w_train is None else w_train.values + w_valid_weight = None if w_valid is None else w_valid.values + + dtrain = lgb.Dataset(x_train.values, label=y_train_1d, weight=w_train_weight) + dvalid = lgb.Dataset(x_valid.values, label=y_valid_1d, weight=w_valid_weight) + self._model = lgb.train( + self._params, + dtrain, + num_boost_round=num_boost_round, + valid_sets=[dtrain, dvalid], + valid_names=["train", "valid"], + early_stopping_rounds=early_stopping_rounds, + verbose_eval=verbose_eval, + evals_result=evals_result, + **kwargs + ) + evals_result["train"] = list(evals_result["train"].values())[0] + evals_result["valid"] = list(evals_result["valid"].values())[0] + + def predict(self, x_test): + if self._model is None: + raise ValueError("model is not fitted yet!") + return self._model.predict(x_test.values) + + def score(self, x_test, y_test, w_test=None): + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, w_test = drop_nan_by_y_index(x_test, y_test, w_test) + preds = self.predict(x_test) + w_test_weight = None if w_test is None else w_test.values + return self._scorer(y_test.values, preds, sample_weight=w_test_weight) + + def save(self, filename): + if self._model is None: + raise ValueError("model is not fitted yet!") + self._model.save_model(filename) + + def load(self, buffer): + self._model = lgb.Booster(params={"model_str": buffer.decode("utf-8")}) diff --git a/qlib/contrib/model/pytorch_nn.py b/qlib/contrib/model/pytorch_nn.py new file mode 100644 index 000000000..6bf74e148 --- /dev/null +++ b/qlib/contrib/model/pytorch_nn.py @@ -0,0 +1,356 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import os +import numpy as np +import pandas as pd +from sklearn.metrics import roc_auc_score, mean_squared_error +import logging +from ...utils import unpack_archive_with_buffer, save_multiple_parts_file, create_save_path, drop_nan_by_y_index +from ...log import get_module_logger, TimeInspector + +import torch +import torch.nn as nn +import torch.optim as optim + +from .base import Model + + +class DNNModelPytorch(Model): + """DNN Model + + Parameters + ---------- + input_dim : int + input dimension + output_dim : int + output dimension + layers : tuple + layer sizes + lr : float + learning rate + lr_decay : float + learning rate decay + lr_decay_steps : int + learning rate decay steps + optimizer : str + optimizer name + GPU : str + the GPU ID(s) used for training + """ + + def __init__( + self, + input_dim, + output_dim, + layers=(256, 256, 128), + lr=0.001, + max_steps=300, + batch_size=2000, + early_stop_rounds=50, + eval_steps=20, + lr_decay=0.96, + lr_decay_steps=100, + optimizer="gd", + loss="mse", + GPU="0", + **kwargs + ): + # Set logger. + self.logger = get_module_logger("DNNModelPytorch") + self.logger.info("DNN pytorch version...") + + # set hyper-parameters. + self.layers = layers + self.lr = lr + self.max_steps = max_steps + self.batch_size = batch_size + self.early_stop_rounds = early_stop_rounds + self.eval_steps = eval_steps + self.lr_decay = lr_decay + self.lr_decay_steps = lr_decay_steps + self.optimizer = optimizer.lower() + self.loss_type = loss + self.visible_GPU = GPU + + self.logger.info( + "DNN parameters setting:" + "\nlayers : {}" + "\nlr : {}" + "\nmax_steps : {}" + "\nbatch_size : {}" + "\nearly_stop_rounds : {}" + "\neval_steps : {}" + "\nlr_decay : {}" + "\nlr_decay_steps : {}" + "\noptimizer : {}" + "\nloss_type : {}" + "\neval_steps : {}" + "\nvisible_GPU : {}".format( + layers, + lr, + max_steps, + batch_size, + early_stop_rounds, + eval_steps, + lr_decay, + lr_decay_steps, + optimizer, + loss, + eval_steps, + GPU, + ) + ) + + if loss not in {"mse", "binary"}: + raise NotImplementedError("loss {} is not supported!".format(loss)) + self._scorer = mean_squared_error if loss == "mse" else roc_auc_score + + self.dnn_model = Net(input_dim, output_dim, layers, loss=self.loss_type) + if optimizer.lower() == "adam": + self.train_optimizer = optim.Adam(self.dnn_model.parameters(), lr=self.lr) + elif optimizer.lower() == "gd": + self.train_optimizer = optim.SGD(self.dnn_model.parameters(), lr=self.lr) + else: + raise NotImplementedError("optimizer {} is not supported!".format(optimizer)) + + # Reduce learning rate when loss has stopped decrease + self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + self.train_optimizer, + mode="min", + factor=0.5, + patience=10, + verbose=True, + threshold=0.0001, + threshold_mode="rel", + cooldown=0, + min_lr=0.00001, + eps=1e-08, + ) + + self._fitted = False + self.dnn_model.cuda() + + # set the visible GPU + if self.visible_GPU: + os.environ["CUDA_VISIBLE_DEVICES"] = self.visible_GPU + + def fit( + self, + x_train, + y_train, + x_valid, + y_valid, + w_train=None, + w_valid=None, + evals_result=dict(), + verbose=True, + save_path=None, + ): + + if w_train is None: + w_train = pd.DataFrame(np.ones_like(y_train.values), index=y_train.index) + if w_valid is None: + w_valid = pd.DataFrame(np.ones_like(y_valid.values), index=y_valid.index) + + save_path = create_save_path(save_path) + stop_steps = 0 + train_loss = 0 + best_loss = np.inf + evals_result["train"] = [] + evals_result["valid"] = [] + + # train + self.logger.info("training...") + self._fitted = True + #return + # prepare training data + x_train_values = torch.from_numpy(x_train.values).float() + y_train_values = torch.from_numpy(y_train.values).float() + w_train_values = torch.from_numpy(w_train.values).float() + train_num = y_train_values.shape[0] + + # prepare validation data + x_val_cuda = torch.from_numpy(x_valid.values).float() + y_val_cuda = torch.from_numpy(y_valid.values).float() + w_val_cuda = torch.from_numpy(w_valid.values).float() + + x_val_cuda = x_val_cuda.cuda() + y_val_cuda = y_val_cuda.cuda() + w_val_cuda = w_val_cuda.cuda() + + for step in range(self.max_steps): + if stop_steps >= self.early_stop_rounds: + if verbose: + self.logger.info("\tearly stop") + break + loss = AverageMeter() + self.dnn_model.train() + self.train_optimizer.zero_grad() + + choice = np.random.choice(train_num, self.batch_size) + x_batch = x_train_values[choice] + y_batch = y_train_values[choice] + w_batch = w_train_values[choice] + + x_batch_cuda = x_batch.float().cuda() + y_batch_cuda = y_batch.float().cuda() + w_batch_cuda = w_batch.float().cuda() + + # forward + preds = self.dnn_model(x_batch_cuda) + cur_loss = self.get_loss(preds, w_batch_cuda, y_batch_cuda, self.loss_type) + cur_loss.backward() + self.train_optimizer.step() + loss.update(cur_loss.item()) + + # validation + train_loss += loss.val + #print(loss.val) + if step and step % self.eval_steps == 0: + stop_steps += 1 + train_loss /= self.eval_steps + + with torch.no_grad(): + self.dnn_model.eval() + loss_val = AverageMeter() + + # forward + preds = self.dnn_model(x_val_cuda) + cur_loss_val = self.get_loss(preds, w_val_cuda, y_val_cuda, self.loss_type) + loss_val.update(cur_loss_val.item()) + if verbose: + self.logger.info( + "[Epoch {}]: train_loss {:.6f}, valid_loss {:.6f}".format(step, train_loss, loss_val.val) + ) + evals_result["train"].append(train_loss) + evals_result["valid"].append(loss_val.val) + if loss_val.val < best_loss: + if verbose: + self.logger.info( + "\tvalid loss update from {:.6f} to {:.6f}, save checkpoint.".format( + best_loss, loss_val.val + ) + ) + best_loss = loss_val.val + stop_steps = 0 + torch.save(self.dnn_model.state_dict(), save_path) + train_loss = 0 + # update learning rate + self.scheduler.step(cur_loss_val) + + # restore the optimal parameters after training ?? + self.dnn_model.load_state_dict(torch.load(save_path)) + torch.cuda.empty_cache() + + def get_loss(self, pred, w, target, loss_type): + if loss_type == "mse": + sqr_loss = torch.mul(pred - target, pred - target) + loss = torch.mul(sqr_loss, w).mean() + return loss + elif loss_type == "binary": + loss = nn.BCELoss() + return loss(pred, target) + else: + raise NotImplementedError("loss {} is not supported!".format(loss_type)) + + def predict(self, x_test): + if not self._fitted: + raise ValueError("model is not fitted yet!") + x_test = torch.from_numpy(x_test.values).float().cuda() + self.dnn_model.eval() + + with torch.no_grad(): + preds = self.dnn_model(x_test).detach().cpu().numpy() + return preds + + def score(self, x_test, y_test, w_test=None): + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, w_test = drop_nan_by_y_index(x_test, y_test, w_test) + preds = self.predict(x_test) + w_test_weight = None if w_test is None else w_test.values + return self._scorer(y_test.values, preds, sample_weight=w_test_weight) + + def save(self, filename, **kwargs): + with save_multiple_parts_file(filename) as model_dir: + model_path = os.path.join(model_dir, os.path.split(model_dir)[-1]) + # Save model + torch.save(self.dnn_model.state_dict(), model_path) + + def load(self, buffer, **kwargs): + with unpack_archive_with_buffer(buffer) as model_dir: + # Get model name + _model_name = os.path.splitext(list(filter(lambda x: x.startswith("model.bin"), os.listdir(model_dir)))[0])[ + 0 + ] + _model_path = os.path.join(model_dir, _model_name) + # Load model + self.dnn_model.load_state_dict(torch.load(_model_path)) + self._fitted = True + + def finetune(self, x_train, y_train, x_valid, y_valid, w_train=None, w_valid=None, **kwargs): + self.fit(x_train, y_train, x_valid, y_valid, w_train=w_train, w_valid=w_valid, **kwargs) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +class Net(nn.Module): + def __init__(self, input_dim, output_dim, layers=(256, 256, 256), loss="mse"): + super(Net, self).__init__() + layers = [input_dim] + list(layers) + dnn_layers = [] + drop_input = nn.Dropout(0.1) + dnn_layers.append(drop_input) + for i, (input_dim, hidden_units) in enumerate(zip(layers[:-1], layers[1:])): + fc = nn.Linear(input_dim, hidden_units) + activation = nn.ReLU() + bn = nn.BatchNorm1d(hidden_units) + drop = nn.Dropout(0.1) + seq = nn.Sequential(fc, bn, activation, drop) + dnn_layers.append(seq) + + if loss == "mse": + fc = nn.Linear(hidden_units, output_dim) + dnn_layers.append(fc) + + elif loss == "binary": + fc = nn.Linear(hidden_units, output_dim) + sigmoid = nn.Sigmoid() + dnn_layers.append(nn.Sequential(fc, sigmoid)) + else: + raise NotImplementedError("loss {} is not supported!".format(loss)) + # optimizer + self.dnn_layers = nn.ModuleList(dnn_layers) + self._weight_init() + + def _weight_init(self): + for m in self.modules(): + if isinstance(m, nn.Linear): + nn.init.xavier_normal_(m.weight, gain=1) + + def forward(self, x): + cur_output = x + for i, now_layer in enumerate(self.dnn_layers): + cur_output = now_layer(cur_output) + return cur_output diff --git a/qlib/contrib/online/__init__.py b/qlib/contrib/online/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/qlib/contrib/online/executor.py b/qlib/contrib/online/executor.py new file mode 100644 index 000000000..2bd0937a0 --- /dev/null +++ b/qlib/contrib/online/executor.py @@ -0,0 +1,291 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import re +import json +import copy +import pathlib +import pandas as pd +from ...data import D +from ...utils import get_date_in_file_name +from ...utils import get_pre_trading_date +from ..backtest.order import Order + + +class BaseExecutor: + """ + # Strategy framework document + + class Executor(BaseExecutor): + """ + + def execute(self, trade_account, order_list, trade_date): + """ + return the executed result (trade_info) after trading at trade_date. + NOTICE: trade_account will not be modified after executing. + Parameter + --------- + trade_account : Account() + order_list : list + [Order()] + trade_date : pd.Timestamp + Return + --------- + trade_info : list + [Order(), float, float, float] + """ + raise NotImplementedError("get_execute_result for this model is not implemented.") + + def save_executed_file_from_trade_info(self, trade_info, user_path, trade_date): + """ + Save the trade_info to the .csv transaction file in disk + the columns of result file is + ['date', 'stock_id', 'direction', 'trade_val', 'trade_cost', 'trade_price', 'factor'] + Parameter + --------- + trade_info : list of [Order(), float, float, float] + (order, trade_val, trade_cost, trade_price), trade_info with out factor + user_path: str / pathlib.Path() + the sub folder to save user data + + transaction_path : string / pathlib.Path() + """ + YYYY, MM, DD = str(trade_date.date()).split("-") + folder_path = pathlib.Path(user_path) / "trade" / YYYY / MM + if not folder_path.exists(): + folder_path.mkdir(parents=True) + transaction_path = folder_path / "transaction_{}.csv".format(str(trade_date.date())) + columns = [ + "date", + "stock_id", + "direction", + "amount", + "trade_val", + "trade_cost", + "trade_price", + "factor", + ] + data = [] + for [order, trade_val, trade_cost, trade_price] in trade_info: + data.append( + [ + trade_date, + order.stock_id, + order.direction, + order.amount, + trade_val, + trade_cost, + trade_price, + order.factor, + ] + ) + df = pd.DataFrame(data, columns=columns) + df.to_csv(transaction_path, index=False) + + def load_trade_info_from_executed_file(self, user_path, trade_date): + YYYY, MM, DD = str(trade_date.date()).split("-") + file_path = pathlib.Path(user_path) / "trade" / YYYY / MM / "transaction_{}.csv".format(str(trade_date.date())) + if not file_path.exists(): + raise ValueError("File {} not exists!".format(file_path)) + + filedate = get_date_in_file_name(file_path) + transaction = pd.read_csv(file_path) + trade_info = [] + for i in range(len(transaction)): + date = transaction.loc[i]["date"] + if not date == filedate: + continue + # raise ValueError("date in transaction file {} not equal to it's file date{}".format(date, filedate)) + order = Order( + stock_id=transaction.loc[i]["stock_id"], + amount=transaction.loc[i]["amount"], + trade_date=transaction.loc[i]["date"], + direction=transaction.loc[i]["direction"], + factor=transaction.loc[i]["factor"], + ) + trade_val = transaction.loc[i]["trade_val"] + trade_cost = transaction.loc[i]["trade_cost"] + trade_price = transaction.loc[i]["trade_price"] + trade_info.append([order, trade_val, trade_cost, trade_price]) + return trade_info + + +class SimulatorExecutor(BaseExecutor): + def __init__(self, trade_exchange, verbose=False): + self.trade_exchange = trade_exchange + self.verbose = verbose + self.order_list = [] + + def execute(self, trade_account, order_list, trade_date): + """ + execute the order list, do the trading wil exchange at date. + Will not modify the trade_account. + Parameter + trade_account : Account() + order_list : list + list or orders + trade_date : pd.Timestamp + :return: + trade_info : list of [Order(), float, float, float] + (order, trade_val, trade_cost, trade_price), trade_info with out factor + """ + account = copy.deepcopy(trade_account) + trade_info = [] + + for order in order_list: + # check holding thresh is done in strategy + # if order.direction==0: # sell order + # # checking holding thresh limit for sell order + # if trade_account.current.get_stock_count(order.stock_id) < thresh: + # # can not sell this code + # continue + # is order executable + # check order + if self.trade_exchange.check_order(order) is True: + # execute the order + trade_val, trade_cost, trade_price = self.trade_exchange.deal_order(order, trade_account=account) + trade_info.append([order, trade_val, trade_cost, trade_price]) + if self.verbose: + if order.direction == Order.SELL: # sell + print( + "[I {:%Y-%m-%d}]: sell {}, price {:.2f}, amount {}, value {:.2f}.".format( + trade_date, + order.stock_id, + trade_price, + order.deal_amount, + trade_val, + ) + ) + else: + print( + "[I {:%Y-%m-%d}]: buy {}, price {:.2f}, amount {}, value {:.2f}.".format( + trade_date, + order.stock_id, + trade_price, + order.deal_amount, + trade_val, + ) + ) + + else: + if self.verbose: + print("[W {:%Y-%m-%d}]: {} wrong.".format(trade_date, order.stock_id)) + # do nothing + pass + return trade_info + + +def save_score_series(score_series, user_path, trade_date): + """Save the score_series into a .csv file. + The columns of saved file is + [stock_id, score] + + Parameter + --------- + order_list: [Order()] + list of Order() + date: pd.Timestamp + the date to save the order list + user_path: str / pathlib.Path() + the sub folder to save user data + """ + user_path = pathlib.Path(user_path) + YYYY, MM, DD = str(trade_date.date()).split("-") + folder_path = user_path / "score" / YYYY / MM + if not folder_path.exists(): + folder_path.mkdir(parents=True) + file_path = folder_path / "score_{}.csv".format(str(trade_date.date())) + score_series.to_csv(file_path) + + +def load_score_series(user_path, trade_date): + """Save the score_series into a .csv file. + The columns of saved file is + [stock_id, score] + + Parameter + --------- + order_list: [Order()] + list of Order() + date: pd.Timestamp + the date to save the order list + user_path: str / pathlib.Path() + the sub folder to save user data + """ + user_path = pathlib.Path(user_path) + YYYY, MM, DD = str(trade_date.date()).split("-") + folder_path = user_path / "score" / YYYY / MM + if not folder_path.exists(): + folder_path.mkdir(parents=True) + file_path = folder_path / "score_{}.csv".format(str(trade_date.date())) + score_series = pd.read_csv(file_path, index_col=0, header=None, names=["instrument", "score"]) + return score_series + + +def save_order_list(order_list, user_path, trade_date): + """ + Save the order list into a json file. + Will calculate the real amount in order according to factors at date. + + The format in json file like + {"sell": {"stock_id": amount, ...} + ,"buy": {"stock_id": amount, ...}} + + :param + order_list: [Order()] + list of Order() + date: pd.Timestamp + the date to save the order list + user_path: str / pathlib.Path() + the sub folder to save user data + """ + user_path = pathlib.Path(user_path) + YYYY, MM, DD = str(trade_date.date()).split("-") + folder_path = user_path / "trade" / YYYY / MM + if not folder_path.exists(): + folder_path.mkdir(parents=True) + sell = {} + buy = {} + for order in order_list: + if order.direction == 0: # sell + sell[order.stock_id] = [order.amount, order.factor] + else: + buy[order.stock_id] = [order.amount, order.factor] + order_dict = {"sell": sell, "buy": buy} + file_path = folder_path / "orderlist_{}.json".format(str(trade_date.date())) + with file_path.open("w") as fp: + json.dump(order_dict, fp) + + +def load_order_list(user_path, trade_date): + user_path = pathlib.Path(user_path) + YYYY, MM, DD = str(trade_date.date()).split("-") + path = user_path / "trade" / YYYY / MM / "orderlist_{}.json".format(str(trade_date.date())) + if not path.exists(): + raise ValueError("File {} not exists!".format(path)) + # get orders + with path.open("r") as fp: + order_dict = json.load(fp) + order_list = [] + for stock_id in order_dict["sell"]: + amount, factor = order_dict["sell"][stock_id] + order = Order( + stock_id=stock_id, + amount=amount, + trade_date=pd.Timestamp(trade_date), + direction=Order.SELL, + factor=factor, + ) + order_list.append(order) + for stock_id in order_dict["buy"]: + amount, factor = order_dict["buy"][stock_id] + order = Order( + stock_id=stock_id, + amount=amount, + trade_date=pd.Timestamp(trade_date), + direction=Order.BUY, + factor=factor, + ) + order_list.append(order) + return order_list diff --git a/qlib/contrib/online/manager.py b/qlib/contrib/online/manager.py new file mode 100644 index 000000000..7e9c766e8 --- /dev/null +++ b/qlib/contrib/online/manager.py @@ -0,0 +1,147 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import pickle +import yaml +import pathlib +import pandas as pd +import shutil +from ..backtest.account import Account +from ..backtest.exchange import Exchange +from .user import User +from .utils import load_instance +from .utils import save_instance, init_instance_by_config + + +class UserManager: + def __init__(self, user_data_path, save_report=True): + """ + This module is designed to manager the users in online system + all users' data were assumed to be saved in user_data_path + Parameter + user_data_path : string + data path that all users' data were saved in + + variables: + data_path : string + data path that all users' data were saved in + users_file : string + A path of the file record the add_date of users + save_report : bool + whether to save report after each trading process + users : dict{} + [user_id]->User() + the python dict save instances of User() for each user_id + user_record : pd.Dataframe + user_id(string), add_date(string) + indicate the add_date for each users + """ + self.data_path = pathlib.Path(user_data_path) + self.users_file = self.data_path / "users.csv" + self.save_report = save_report + self.users = {} + self.user_record = None + + def load_users(self): + """ + load all users' data into manager + """ + self.users = {} + self.user_record = pd.read_csv(self.users_file, index_col=0) + for user_id in self.user_record.index: + self.users[user_id] = self.load_user(user_id) + + def load_user(self, user_id): + """ + return a instance of User() represents a user to be processed + Parameter + user_id : string + :return + user : User() + """ + account_path = self.data_path / user_id + strategy_file = self.data_path / user_id / "strategy_{}.pickle".format(user_id) + model_file = self.data_path / user_id / "model_{}.pickle".format(user_id) + cur_user_list = [user_id for user_id in self.users] + if user_id in cur_user_list: + raise ValueError("User {} has been loaded".format(user_id)) + else: + trade_account = Account(0) + trade_account.load_account(account_path) + strategy = load_instance(strategy_file) + model = load_instance(model_file) + user = User(account=trade_account, strategy=strategy, model=model) + return user + + def save_user_data(self, user_id): + """ + save a instance of User() to user data path + Parameter + user_id : string + """ + if not user_id in self.users: + raise ValueError("Cannot find user {}".format(user_id)) + self.users[user_id].account.save_account(self.data_path / user_id) + save_instance( + self.users[user_id].strategy, + self.data_path / user_id / "strategy_{}.pickle".format(user_id), + ) + save_instance( + self.users[user_id].model, + self.data_path / user_id / "model_{}.pickle".format(user_id), + ) + + def add_user(self, user_id, config_file, add_date): + """ + add the new user {user_id} into user data + will create a new folder named "{user_id}" in user data path + Parameter + user_id : string + init_cash : int + config_file : str/pathlib.Path() + path of config file + """ + config_file = pathlib.Path(config_file) + if not config_file.exists(): + raise ValueError("Cannot find config file {}".format(config_file)) + user_path = self.data_path / user_id + if user_path.exists(): + raise ValueError("User data for {} already exists".format(user_id)) + + with config_file.open("r") as fp: + config = yaml.load(fp) + # load model + model = init_instance_by_config(config["model"]) + + # load strategy + strategy = init_instance_by_config(config["strategy"]) + init_args = strategy.get_init_args_from_model(model, add_date) + strategy.init(**init_args) + + # init Account + trade_account = Account(init_cash=config["init_cash"]) + + # save user + user_path.mkdir() + save_instance(model, self.data_path / user_id / "model_{}.pickle".format(user_id)) + save_instance(strategy, self.data_path / user_id / "strategy_{}.pickle".format(user_id)) + trade_account.save_account(self.data_path / user_id) + user_record = pd.read_csv(self.users_file, index_col=0) + user_record.loc[user_id] = [add_date] + user_record.to_csv(self.users_file) + + def remove_user(self, user_id): + """ + remove user {user_id} in current user dataset + will delete the folder "{user_id}" in user data path + :param + user_id : string + """ + user_path = self.data_path / user_id + if not user_path.exists(): + raise ValueError("Cannot find user data {}".format(user_id)) + shutil.rmtree(user_path) + user_record = pd.read_csv(self.users_file, index_col=0) + user_record.drop([user_id], inplace=True) + user_record.to_csv(self.users_file) diff --git a/qlib/contrib/online/online_model.py b/qlib/contrib/online/online_model.py new file mode 100644 index 000000000..0e8c0cb19 --- /dev/null +++ b/qlib/contrib/online/online_model.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import random +import pandas as pd +from ...data import D +from ..model.base import Model + + +class ScoreFileModel(Model): + """ + This model will load a score file, and return score at date exists in score file. + """ + + def __init__(self, score_path): + pred_test = pd.read_csv(score_path, index_col=[0, 1], parse_dates=True, infer_datetime_format=True) + self.pred = pred_test + + def get_data_with_date(self, date, **kwargs): + score = self.pred.loc(axis=0)[:, date] # (stock_id, trade_date) multi_index, score in pdate + score_series = score.reset_index(level="datetime", drop=True)[ + "score" + ] # pd.Series ; index:stock_id, data: score + return score_series + + def predict(self, x_test, **kwargs): + return x_test + + def score(self, x_test, **kwargs): + return + + def fit(self, x_train, y_train, x_valid, y_valid, w_train=None, w_valid=None, **kwargs): + return + + def save(self, fname, **kwargs): + return diff --git a/qlib/contrib/online/operator.py b/qlib/contrib/online/operator.py new file mode 100644 index 000000000..500e732ff --- /dev/null +++ b/qlib/contrib/online/operator.py @@ -0,0 +1,317 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import fire +import pandas as pd +import pathlib +import qlib +import logging + +from ...data import D +from ...log import get_module_logger +from ...utils import get_pre_trading_date, is_tradable_date +from ..evaluate import risk_analysis +from ..backtest.backtest import update_account + +from .manager import UserManager +from .utils import prepare +from .utils import create_user_folder +from .executor import load_order_list, save_order_list +from .executor import SimulatorExecutor +from .executor import save_score_series, load_score_series + + +class Operator(object): + def __init__(self, client: str): + """ + Parameters + ---------- + client: str + The qlib client config file(.yaml) + """ + self.logger = get_module_logger("online operator", level=logging.INFO) + self.client = client + + @staticmethod + def init(client, path, date=None): + """Initial UserManager(), get predict date and trade date + Parameters + ---------- + client: str + The qlib client config file(.yaml) + path : str + Path to save user account. + date : str (YYYY-MM-DD) + Trade date, when the generated order list will be traded. + Return + ---------- + um: UserManager() + pred_date: pd.Timestamp + trade_date: pd.Timestamp + """ + qlib.init_from_yaml_conf(client) + um = UserManager(user_data_path=pathlib.Path(path)) + um.load_users() + if not date: + trade_date, pred_date = None, None + else: + trade_date = pd.Timestamp(date) + if not is_tradable_date(trade_date): + raise ValueError("trade date is not tradable date".format(trade_date.date())) + pred_date = get_pre_trading_date(trade_date, future=True) + return um, pred_date, trade_date + + def add_user(self, id, config, path, date): + """Add a new user into the a folder to run 'online' module. + + Parameters + ---------- + id : str + User id, should be unique. + config : str + The file path (yaml) of user config + path : str + Path to save user account. + date : str (YYYY-MM-DD) + The date that user account was added. + """ + create_user_folder(path) + qlib.init_from_yaml_conf(self.client) + um = UserManager(user_data_path=path) + add_date = D.calendar(end_time=date)[-1] + if not is_tradable_date(add_date): + raise ValueError("add date is not tradable date".format(add_date.date())) + um.add_user(user_id=id, config_file=config, add_date=add_date) + + def remove_user(self, id, path): + """Remove user from folder used in 'online' module. + + Parameters + ---------- + id : str + User id, should be unique. + path : str + Path to save user account. + """ + um = UserManager(user_data_path=path) + um.remove_user(user_id=id) + + def generate(self, date, path): + """Generate order list that will be traded at 'date'. + + Parameters + ---------- + date : str (YYYY-MM-DD) + Trade date, when the generated order list will be traded. + path : str + Path to save user account. + """ + um, pred_date, trade_date = self.init(self.client, path, date) + for user_id, user in um.users.items(): + dates, trade_exchange = prepare(um, pred_date, user_id) + # get and save the score at predict date + input_data = user.model.get_data_with_date(pred_date) + score_series = user.model.predict(input_data) + save_score_series(score_series, (pathlib.Path(path) / user_id), trade_date) + + # update strategy (and model) + user.strategy.update(score_series, pred_date, trade_date) + + # generate and save order list + order_list = user.strategy.generate_order_list( + score_series=score_series, + current=user.account.current, + trade_exchange=trade_exchange, + trade_date=trade_date, + ) + save_order_list( + order_list=order_list, + user_path=(pathlib.Path(path) / user_id), + trade_date=trade_date, + ) + self.logger.info("Generate order list at {} for {}".format(trade_date, user_id)) + um.save_user_data(user_id) + + def execute(self, date, exchange_config, path): + """Execute the orderlist at 'date'. + + Parameters + ---------- + date : str (YYYY-MM-DD) + Trade date, that the generated order list will be traded. + exchange_config: str + The file path (yaml) of exchange config + path : str + Path to save user account. + """ + um, pred_date, trade_date = self.init(self.client, path, date) + for user_id, user in um.users.items(): + dates, trade_exchange = prepare(um, trade_date, user_id, exchange_config) + executor = SimulatorExecutor(trade_exchange=trade_exchange) + if not str(dates[0].date()) == str(pred_date.date()): + raise ValueError( + "The account data is not newest! last trading date {}, today {}".format( + dates[0].date(), trade_date.date() + ) + ) + + # load and execute the order list + # will not modify the trade_account after executing + order_list = load_order_list(user_path=(pathlib.Path(path) / user_id), trade_date=trade_date) + trade_info = executor.execute(order_list=order_list, trade_account=user.account, trade_date=trade_date) + executor.save_executed_file_from_trade_info( + trade_info=trade_info, + user_path=(pathlib.Path(path) / user_id), + trade_date=trade_date, + ) + self.logger.info("execute order list at {} for {}".format(trade_date.date(), user_id)) + + def update(self, date, path, type="SIM"): + """Update account at 'date'. + + Parameters + ---------- + date : str (YYYY-MM-DD) + Trade date, that the generated order list will be traded. + path : str + Path to save user account. + type : str + which executor was been used to execute the order list + 'SIM': SimulatorExecutor() + """ + if type not in ["SIM", "YC"]: + raise ValueError("type is invalid, {}".format(type)) + um, pred_date, trade_date = self.init(self.client, path, date) + for user_id, user in um.users.items(): + dates, trade_exchange = prepare(um, trade_date, user_id) + if type == "SIM": + executor = SimulatorExecutor(trade_exchange=trade_exchange) + else: + raise ValueError("not found executor") + # dates[0] is the last_trading_date + if str(dates[0].date()) > str(pred_date.date()): + raise ValueError( + "The account data is not newest! last trading date {}, today {}".format( + dates[0].date(), trade_date.date() + ) + ) + # load trade info and update account + trade_info = executor.load_trade_info_from_executed_file( + user_path=(pathlib.Path(path) / user_id), trade_date=trade_date + ) + score_series = load_score_series((pathlib.Path(path) / user_id), trade_date) + update_account(user.account, trade_info, trade_exchange, trade_date) + + report = user.account.report.generate_report_dataframe() + self.logger.info(report) + um.save_user_data(user_id) + self.logger.info("Update account state {} for {}".format(trade_date, user_id)) + + def simulate(self, id, config, exchange_config, start, end, path, bench="SH000905"): + """Run the ( generate_order_list -> execute_order_list -> update_account) process everyday + from start date to end date. + + Parameters + ---------- + id : str + user id, need to be unique + config : str + The file path (yaml) of user config + exchange_config: str + The file path (yaml) of exchange config + start : str "YYYY-MM-DD" + The start date to run the online simulate + end : str "YYYY-MM-DD" + The end date to run the online simulate + path : str + Path to save user account. + bench : str + The benchmark that our result compared with. + 'SH000905' for csi500, 'SH000300' for csi300 + """ + # Clear the current user if exists, then add a new user. + create_user_folder(path) + um = self.init(self.client, path, None)[0] + start_date, end_date = pd.Timestamp(start), pd.Timestamp(end) + try: + um.remove_user(user_id=id) + except BaseException: + pass + um.add_user(user_id=id, config_file=config, add_date=pd.Timestamp(start_date)) + + # Do the online simulate + um.load_users() + user = um.users[id] + dates, trade_exchange = prepare(um, end_date, id, exchange_config) + executor = SimulatorExecutor(trade_exchange=trade_exchange) + for pred_date, trade_date in zip(dates[:-2], dates[1:-1]): + user_path = pathlib.Path(path) / id + + # 1. load and save score_series + input_data = user.model.get_data_with_date(pred_date) + score_series = user.model.predict(input_data) + save_score_series(score_series, (pathlib.Path(path) / id), trade_date) + + # 2. update strategy (and model) + user.strategy.update(score_series, pred_date, trade_date) + + # 3. generate and save order list + order_list = user.strategy.generate_order_list( + score_series=score_series, + current=user.account.current, + trade_exchange=trade_exchange, + trade_date=trade_date, + ) + save_order_list(order_list=order_list, user_path=user_path, trade_date=trade_date) + + # 4. auto execute order list + order_list = load_order_list(user_path=user_path, trade_date=trade_date) + trade_info = executor.execute(trade_account=user.account, order_list=order_list, trade_date=trade_date) + executor.save_executed_file_from_trade_info( + trade_info=trade_info, user_path=user_path, trade_date=trade_date + ) + # 5. update account state + trade_info = executor.load_trade_info_from_executed_file(user_path=user_path, trade_date=trade_date) + update_account(user.account, trade_info, trade_exchange, trade_date) + report = user.account.report.generate_report_dataframe() + self.logger.info(report) + um.save_user_data(id) + self.show(id, path, bench) + + def show(self, id, path, bench="SH000905"): + """show the newly report (mean, std, sharpe, annual) + + Parameters + ---------- + id : str + user id, need to be unique + path : str + Path to save user account. + bench : str + The benchmark that our result compared with. + 'SH000905' for csi500, 'SH000300' for csi300 + """ + um = self.init(self.client, path, None)[0] + if id not in um.users: + raise ValueError("Cannot find user ".format(id)) + bench = D.features([bench], ["$change"]).loc[bench, "$change"] + report = um.users[id].account.report.generate_report_dataframe() + report["bench"] = bench + analysis_result = {} + r = (report["return"] - report["bench"]).dropna() + analysis_result["sub_bench"] = risk_analysis(r) + r = (report["return"] - report["bench"] - report["cost"]).dropna() + analysis_result["sub_cost"] = risk_analysis(r) + print("Result:") + print("sub_bench:") + print(analysis_result["sub_bench"]) + print("sub_cost:") + print(analysis_result["sub_cost"]) + + +def run(): + fire.Fire(Operator) + + +if __name__ == "__main__": + run() diff --git a/qlib/contrib/online/user.py b/qlib/contrib/online/user.py new file mode 100644 index 000000000..d8a8fdabe --- /dev/null +++ b/qlib/contrib/online/user.py @@ -0,0 +1,74 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import logging + +from ...log import get_module_logger +from ..evaluate import risk_analysis +from ...data import D + + +class User: + def __init__(self, account, strategy, model, verbose=False): + """ + A user in online system, which contains account, strategy and model three module. + Parameter + account : Account() + strategy : + a strategy instance + model : + a model instance + report_save_path : string + the path to save report. Will not save report if None + verbose : bool + Whether to print the info during the process + """ + self.logger = get_module_logger("User", level=logging.INFO) + self.account = account + self.strategy = strategy + self.model = model + self.verbose = verbose + + def init_state(self, date): + """ + init state when each trading date begin + Parameter + date : pd.Timestamp + """ + self.account.init_state(today=date) + self.strategy.init_state(trade_date=date, model=self.model, account=self.account) + return + + def get_latest_trading_date(self): + """ + return the latest trading date for user {user_id} + Parameter + user_id : string + :return + date : string (e.g '2018-10-08') + """ + if not self.account.last_trade_date: + return None + return str(self.account.last_trade_date.date()) + + def showReport(self, benchmark="SH000905"): + """ + show the newly report (mean, std, sharpe, annual) + Parameter + benchmark : string + bench that to be compared, 'SH000905' for csi500 + """ + bench = D.features([benchmark], ["$change"], disk_cache=True).loc[benchmark, "$change"] + report = self.account.report.generate_report_dataframe() + report["bench"] = bench + analysis_result = {"pred": {}, "sub_bench": {}, "sub_cost": {}} + r = (report["return"] - report["bench"]).dropna() + analysis_result["sub_bench"][0] = risk_analysis(r) + r = (report["return"] - report["bench"] - report["cost"]).dropna() + analysis_result["sub_cost"][0] = risk_analysis(r) + self.logger.info("Result of porfolio:") + self.logger.info("sub_bench:") + self.logger.info(analysis_result["sub_bench"][0]) + self.logger.info("sub_cost:") + self.logger.info(analysis_result["sub_cost"][0]) + return report diff --git a/qlib/contrib/online/utils.py b/qlib/contrib/online/utils.py new file mode 100644 index 000000000..cf08e4dbe --- /dev/null +++ b/qlib/contrib/online/utils.py @@ -0,0 +1,110 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import pathlib +import pickle +import yaml +import pandas as pd +from ...data import D +from ...log import get_module_logger +from ...utils import get_module_by_module_path +from ...utils import get_next_trading_date +from ..backtest.exchange import Exchange + +log = get_module_logger("utils") + + +def load_instance(file_path): + """ + load a pickle file + Parameter + file_path : string / pathlib.Path() + path of file to be loaded + :return + An instance loaded from file + """ + file_path = pathlib.Path(file_path) + if not file_path.exists(): + raise ValueError("Cannot find file {}".format(file_path)) + with file_path.open("rb") as fr: + instance = pickle.load(fr) + return instance + + +def save_instance(instance, file_path): + """ + save(dump) an instance to a pickle file + Parameter + instance : + data to te dumped + file_path : string / pathlib.Path() + path of file to be dumped + """ + file_path = pathlib.Path(file_path) + with file_path.open("wb") as fr: + pickle.dump(instance, fr) + + +def init_instance_by_config(config): + """ + generate an instance with settings in config + Parameter + config : dict + python dict indicate a init parameters to create an item + :return + An instance + """ + module = get_module_by_module_path(config["module_path"]) + instance_class = getattr(module, config["class"]) + instance = instance_class(**config["args"]) + return instance + + +def create_user_folder(path): + path = pathlib.Path(path) + if path.exists(): + return + path.mkdir(parents=True) + head = pd.DataFrame(columns=("user_id", "add_date")) + head.to_csv(path / "users.csv", index=None) + + +def prepare(um, today, user_id, exchange_config=None): + """ + 1. Get the dates that need to do trading till today for user {user_id} + dates[0] indicate the latest trading date of User{user_id}, + if User{user_id} haven't do trading before, than dates[0] presents the init date of User{user_id}. + 2. Set the exchange with exchange_config file + + Parameter + um : UserManager() + today : pd.Timestamp() + user_id : str + :return + dates : list of pd.Timestamp + trade_exchange : Exchange() + """ + # get latest trading date for {user_id} + # if is None, indicate it haven't traded, then last trading date is init date of {user_id} + latest_trading_date = um.users[user_id].get_latest_trading_date() + if not latest_trading_date: + latest_trading_date = um.user_record.loc[user_id][0] + + if str(today.date()) < latest_trading_date: + log.warning("user_id:{}, last trading date {} after today {}".format(user_id, latest_trading_date, today)) + return [pd.Timestamp(latest_trading_date)], None + + dates = D.calendar( + start_time=pd.Timestamp(latest_trading_date), + end_time=pd.Timestamp(today), + future=True, + ) + dates = list(dates) + dates.append(get_next_trading_date(dates[-1], future=True)) + if exchange_config: + with pathlib.Path(exchange_config).open("r") as fp: + exchange_paras = yaml.load(fp) + else: + exchange_paras = {} + trade_exchange = Exchange(trade_dates=dates, **exchange_paras) + return dates, trade_exchange diff --git a/qlib/contrib/report/__init__.py b/qlib/contrib/report/__init__.py new file mode 100644 index 000000000..06309f412 --- /dev/null +++ b/qlib/contrib/report/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +GRAPH_NAME_LISt = [ + "analysis_position.report_graph", + "analysis_position.score_ic_graph", + "analysis_position.cumulative_return_graph", + "analysis_position.risk_analysis_graph", + "analysis_position.rank_label_graph", + "analysis_model.model_performance_graph", +] diff --git a/qlib/contrib/report/analysis_model/__init__.py b/qlib/contrib/report/analysis_model/__init__.py new file mode 100644 index 000000000..496805d67 --- /dev/null +++ b/qlib/contrib/report/analysis_model/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from .analysis_model_performance import model_performance_graph diff --git a/qlib/contrib/report/analysis_model/analysis_model_performance.py b/qlib/contrib/report/analysis_model/analysis_model_performance.py new file mode 100644 index 000000000..cf0bff18f --- /dev/null +++ b/qlib/contrib/report/analysis_model/analysis_model_performance.py @@ -0,0 +1,304 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import pandas as pd + +import plotly.tools as tls +import plotly.graph_objs as go + +import statsmodels.api as sm +import matplotlib.pyplot as plt + +from scipy import stats + +from ..graph import ScatterGraph, SubplotsGraph, BarGraph, HeatmapGraph + + +def _group_return( + pred_label: pd.DataFrame = None, reverse: bool = False, N: int = 5, **kwargs +) -> tuple: + """ + + :param pred_label: + :param reverse: + :param N: + :return: + """ + if reverse: + pred_label["score"] *= -1 + + pred_label = pred_label.sort_values("score", ascending=False) + + # Group1 ~ Group5 only consider the dropna values + pred_label_drop = pred_label.dropna(subset=["score"]) + + # Group + t_df = pd.DataFrame( + { + "Group-%d" + % (i + 1): pred_label_drop.groupby(level="datetime")["label"].apply( + lambda x: x[len(x) // N * i : len(x) // N * (i + 1)].mean() + ) + for i in range(N) + } + ) + t_df.index = pd.to_datetime(t_df.index) + + # Long-Short + t_df["long-short"] = t_df["Group-1"] - t_df["Group-%d" % N] + + # Long-Average + t_df["long-average"] = ( + t_df["Group-1"] - pred_label.groupby(level="datetime")["label"].mean() + ) + + t_df = t_df.dropna(how="all") # for days which does not contain label + # FIXME: support HIGH-FREQ + t_df.index = t_df.index.strftime("%Y-%m-%d") + # Cumulative Return By Group + group_scatter_figure = ScatterGraph( + t_df.cumsum(), + layout=dict( + title="Cumulative Return", xaxis=dict(type="category", tickangle=45) + ), + ).figure + + t_df = t_df.loc[:, ["long-short", "long-average"]] + _bin_size = ((t_df.max() - t_df.min()) / 20).min() + group_hist_figure = SubplotsGraph( + t_df, + kind_map=dict(kind="DistplotGraph", kwargs=dict(bin_size=_bin_size)), + subplots_kwargs=dict( + rows=1, + cols=2, + print_grid=False, + subplot_titles=["long-short", "long-average"], + ), + ).figure + + return group_scatter_figure, group_hist_figure + + +def _plot_qq(data: pd.Series = None, dist=stats.norm) -> go.Figure: + """ + + :param data: + :param dist: + :return: + """ + fig, ax = plt.subplots(figsize=(8, 5)) + _mpl_fig = sm.qqplot(data.dropna(), dist, fit=True, line="45", ax=ax) + return tls.mpl_to_plotly(_mpl_fig) + + +def _pred_ic(pred_label: pd.DataFrame = None, rank: bool = False, **kwargs) -> tuple: + """ + + :param pred_label: + :param rank: + :return: + """ + if rank: + ic = pred_label.groupby(level="datetime").apply( + lambda x: x["label"].rank(pct=True).corr(x["score"].rank(pct=True)) + ) + else: + ic = pred_label.groupby(level="datetime").apply( + lambda x: x["label"].corr(x["score"]) + ) + + _index = ( + ic.index.get_level_values(0).astype("str").str.replace("-", "").str.slice(0, 6) + ) + _monthly_ic = ic.groupby(_index).mean() + _monthly_ic.index = pd.MultiIndex.from_arrays( + [_monthly_ic.index.str.slice(0, 4), _monthly_ic.index.str.slice(4, 6)], + names=["year", "month"], + ) + + # fill month + _month_list = pd.date_range( + start=pd.Timestamp(f"{_index.min()[:4]}0101"), + end=pd.Timestamp(f"{_index.max()[:4]}1231"), + freq="1M", + ) + _years = [] + _month = [] + for _date in _month_list: + _date = _date.strftime("%Y%m%d") + _years.append(_date[:4]) + _month.append(_date[4:6]) + + fill_index = pd.MultiIndex.from_arrays([_years, _month], names=["year", "month"]) + + _monthly_ic = _monthly_ic.reindex(fill_index) + + _ic_df = ic.to_frame("ic") + ic_bar_figure = ic_figure(_ic_df, kwargs.get("show_nature_day", True)) + + ic_heatmap_figure = HeatmapGraph( + _monthly_ic.unstack(), + layout=dict(title="Monthly IC", yaxis=dict(tickformat=",d")), + graph_kwargs=dict(xtype="array", ytype="array"), + ).figure + + dist = stats.norm + _qqplot_fig = _plot_qq(ic, dist) + + if isinstance(dist, stats.norm.__class__): + dist_name = "Normal" + else: + dist_name = "Unknown" + + _bin_size = ((_ic_df.max() - _ic_df.min()) / 20).min() + _sub_graph_data = [ + ( + "ic", + dict( + row=1, + col=1, + name="", + kind="DistplotGraph", + graph_kwargs=dict(bin_size=_bin_size), + ), + ), + (_qqplot_fig, dict(row=1, col=2)), + ] + ic_hist_figure = SubplotsGraph( + _ic_df.dropna(), + kind_map=dict(kind="HistogramGraph", kwargs=dict()), + subplots_kwargs=dict( + rows=1, + cols=2, + print_grid=False, + subplot_titles=["IC", "IC %s Dist. Q-Q" % dist_name], + ), + sub_graph_data=_sub_graph_data, + layout=dict( + yaxis2=dict(title="Observed Quantile"), + xaxis2=dict(title=f"{dist_name} Distribution Quantile"), + ), + ).figure + + return ic_bar_figure, ic_heatmap_figure, ic_hist_figure + + +def _pred_autocorr(pred_label: pd.DataFrame, lag=1, **kwargs) -> tuple: + pred = pred_label.copy() + pred["score_last"] = pred.groupby(level="instrument")["score"].shift(lag) + ac = pred.groupby(level="datetime").apply( + lambda x: x["score"].rank(pct=True).corr(x["score_last"].rank(pct=True)) + ) + # FIXME: support HIGH-FREQ + _df = ac.to_frame("value") + _df.index = _df.index.strftime("%Y-%m-%d") + ac_figure = ScatterGraph( + _df, + layout=dict( + title="Auto Correlation", xaxis=dict(type="category", tickangle=45) + ), + ).figure + return (ac_figure,) + + +def _pred_turnover(pred_label: pd.DataFrame, N=5, lag=1, **kwargs) -> tuple: + pred = pred_label.copy() + pred["score_last"] = pred.groupby(level="instrument")["score"].shift(lag) + top = pred.groupby(level="datetime").apply( + lambda x: 1 + - x.nlargest(len(x) // N, columns="score") + .index.isin(x.nlargest(len(x) // N, columns="score_last").index) + .sum() + / (len(x) // N) + ) + bottom = pred.groupby(level="datetime").apply( + lambda x: 1 + - x.nsmallest(len(x) // N, columns="score") + .index.isin(x.nsmallest(len(x) // N, columns="score_last").index) + .sum() + / (len(x) // N) + ) + r_df = pd.DataFrame({"Top": top, "Bottom": bottom,}) + # FIXME: support HIGH-FREQ + r_df.index = r_df.index.strftime("%Y-%m-%d") + turnover_figure = ScatterGraph( + r_df, + layout=dict( + title="Top-Bottom Turnover", xaxis=dict(type="category", tickangle=45) + ), + ).figure + return (turnover_figure,) + + +def ic_figure(ic_df: pd.DataFrame, show_nature_day=True, **kwargs) -> go.Figure: + """IC figure + + :param ic_df: ic DataFrame + :param show_nature_day: whether to display the abscissa of non-trading day + :return: plotly.graph_objs.Figure + """ + if show_nature_day: + date_index = pd.date_range(ic_df.index.min(), ic_df.index.max()) + ic_df = ic_df.reindex(date_index) + # FIXME: support HIGH-FREQ + ic_df.index = ic_df.index.strftime("%Y-%m-%d") + ic_bar_figure = BarGraph( + ic_df, + layout=dict( + title="Information Coefficient (IC)", + xaxis=dict(type="category", tickangle=45), + ), + ).figure + return ic_bar_figure + + +def model_performance_graph( + pred_label: pd.DataFrame, + lag: int = 1, + N: int = 5, + reverse=False, + rank=False, + graph_names: list = ["group_return", "pred_ic", "pred_autocorr"], + show_notebook: bool = True, + show_nature_day=True, +) -> [list, tuple]: + """Model performance + + :param pred_label: index is **pd.MultiIndex**, index name is **[instrument, datetime]**; columns names is **[score, label]** + + + .. code-block:: python + + instrument datetime score label + SH600004 2017-12-11 -0.013502 -0.013502 + 2017-12-12 -0.072367 -0.072367 + 2017-12-13 -0.068605 -0.068605 + 2017-12-14 0.012440 0.012440 + 2017-12-15 -0.102778 -0.102778 + + + :param lag: `pred.groupby(level='instrument')['score'].shift(lag)`. It will be only used in the auto-correlation computing. + :param N: group number, default 5 + :param reverse: if `True`, `pred['score'] *= -1` + :param rank: if **True**, calculate rank ic + :param graph_names: graph names; default ['cumulative_return', 'pred_ic', 'pred_autocorr', 'pred_turnover'] + :param show_notebook: whether to display graphics in notebook, the default is `True` + :param show_nature_day: whether to display the abscissa of non-trading day + :return: if show_notebook is True, display in notebook; else return `plotly.graph_objs.Figure` list + """ + figure_list = [] + for graph_name in graph_names: + fun_res = eval(f"_{graph_name}")( + pred_label=pred_label, + lag=lag, + N=N, + reverse=reverse, + rank=rank, + show_nature_day=show_nature_day, + ) + figure_list += fun_res + + if show_notebook: + BarGraph.show_graph_in_notebook(figure_list) + else: + return figure_list diff --git a/qlib/contrib/report/analysis_position/__init__.py b/qlib/contrib/report/analysis_position/__init__.py new file mode 100644 index 000000000..86d8803dd --- /dev/null +++ b/qlib/contrib/report/analysis_position/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from .cumulative_return import cumulative_return_graph +from .score_ic import score_ic_graph +from .report import report_graph +from .rank_label import rank_label_graph +from .risk_analysis import risk_analysis_graph diff --git a/qlib/contrib/report/analysis_position/cumulative_return.py b/qlib/contrib/report/analysis_position/cumulative_return.py new file mode 100644 index 000000000..8efd6cd98 --- /dev/null +++ b/qlib/contrib/report/analysis_position/cumulative_return.py @@ -0,0 +1,281 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import copy +from typing import Iterable + +import pandas as pd +import plotly.graph_objs as go + +from ..graph import BaseGraph, SubplotsGraph + +from ..analysis_position.parse_position import get_position_data + + +def _get_cum_return_data_with_position( + position: dict, + report_normal: pd.DataFrame, + label_data: pd.DataFrame, + start_date=None, + end_date=None, +): + """ + + :param position: + :param report_normal: + :param label_data: + :param start_date: + :param end_date: + :return: + """ + _cumulative_return_df = get_position_data( + position=position, + report_normal=report_normal, + label_data=label_data, + start_date=start_date, + end_date=end_date, + ).copy() + + _cumulative_return_df["label"] = ( + _cumulative_return_df["label"] - _cumulative_return_df["bench"] + ) + _cumulative_return_df = _cumulative_return_df.dropna() + df_gp = _cumulative_return_df.groupby(level="datetime") + result_list = [] + for gp in df_gp: + date = gp[0] + day_df = gp[1] + + _hold_df = day_df[day_df["status"] == 0] + _buy_df = day_df[day_df["status"] == 1] + _sell_df = day_df[day_df["status"] == -1] + + hold_value = (_hold_df["label"] * _hold_df["weight"]).sum() + hold_weight = _hold_df["weight"].sum() + hold_mean = (hold_value / hold_weight) if hold_weight else 0 + + sell_value = (_sell_df["label"] * _sell_df["weight"]).sum() + sell_weight = _sell_df["weight"].sum() + sell_mean = (sell_value / sell_weight) if sell_weight else 0 + + buy_value = (_buy_df["label"] * _buy_df["weight"]).sum() + buy_weight = _buy_df["weight"].sum() + buy_mean = (buy_value / buy_weight) if buy_weight else 0 + + result_list.append( + dict( + hold_value=hold_value, + hold_mean=hold_mean, + hold_weight=hold_weight, + buy_value=buy_value, + buy_mean=buy_mean, + buy_weight=buy_weight, + sell_value=sell_value, + sell_mean=sell_mean, + sell_weight=sell_weight, + buy_minus_sell_value=buy_value - sell_value, + buy_minus_sell_mean=buy_mean - sell_mean, + buy_plus_sell_weight=buy_weight + sell_weight, + date=date, + ) + ) + + r_df = pd.DataFrame(data=result_list) + r_df["cum_hold"] = r_df["hold_mean"].cumsum() + r_df["cum_buy"] = r_df["buy_mean"].cumsum() + r_df["cum_sell"] = r_df["sell_mean"].cumsum() + r_df["cum_buy_minus_sell"] = r_df["buy_minus_sell_mean"].cumsum() + return r_df + + +def _get_figure_with_position( + position: dict, + report_normal: pd.DataFrame, + label_data: pd.DataFrame, + start_date=None, + end_date=None, +) -> Iterable[go.Figure]: + """Get average analysis figures + + :param position: position + :param report_normal: + :param label_data: + :param start_date: + :param end_date: + :return: + """ + + cum_return_df = _get_cum_return_data_with_position( + position, report_normal, label_data, start_date, end_date + ) + cum_return_df = cum_return_df.set_index("date") + # FIXME: support HIGH-FREQ + cum_return_df.index = cum_return_df.index.strftime('%Y-%m-%d') + + # Create figures + for _t_name in ["buy", "sell", "buy_minus_sell", "hold"]: + sub_graph_data = [ + ( + "cum_{}".format(_t_name), + dict( + row=1, col=1, graph_kwargs={"mode": "lines+markers", "xaxis": "x3"} + ), + ), + ( + "{}_weight".format( + _t_name.replace("minus", "plus") if "minus" in _t_name else _t_name + ), + dict(row=2, col=1), + ), + ( + "{}_value".format(_t_name), + dict(row=1, col=2, kind="HistogramGraph", graph_kwargs={}), + ), + ] + + _default_xaxis = dict(showline=False, zeroline=True, tickangle=45) + _default_yaxis = dict(zeroline=True, showline=True, showticklabels=True) + sub_graph_layout = dict( + xaxis1=dict(**_default_xaxis, type="category", showticklabels=False), + xaxis3=dict(**_default_xaxis, type="category"), + xaxis2=_default_xaxis, + yaxis1=dict(**_default_yaxis, title=_t_name), + yaxis2=_default_yaxis, + yaxis3=_default_yaxis, + ) + + mean_value = cum_return_df["{}_value".format(_t_name)].mean() + layout = dict( + height=500, + title=f"{_t_name}(the red line in the histogram on the right represents the average)", + shapes=[ + { + "type": "line", + "xref": "x2", + "yref": "paper", + "x0": mean_value, + "y0": 0, + "x1": mean_value, + "y1": 1, + # NOTE: 'fillcolor': '#d3d3d3', 'opacity': 0.3, + "line": {"color": "red", "width": 1}, + }, + ], + ) + + kind_map = dict(kind="ScatterGraph", kwargs=dict(mode="lines+markers")) + specs = [ + [{"rowspan": 1}, {"rowspan": 2}], + [{"rowspan": 1}, None], + ] + subplots_kwargs = dict( + vertical_spacing=0.01, + rows=2, + cols=2, + row_width=[1, 2], + column_width=[3, 1], + print_grid=False, + specs=specs, + ) + yield SubplotsGraph( + cum_return_df, + layout=layout, + kind_map=kind_map, + sub_graph_layout=sub_graph_layout, + sub_graph_data=sub_graph_data, + subplots_kwargs=subplots_kwargs, + ).figure + + +def cumulative_return_graph( + position: dict, + report_normal: pd.DataFrame, + label_data: pd.DataFrame, + show_notebook=True, + start_date=None, + end_date=None, +) -> Iterable[go.Figure]: + """Backtest buy, sell, and holding cumulative return graph + + Example: + + + .. code-block:: python + + from qlib.data import D + from qlib.contrib.evaluate import risk_analysis, backtest, long_short_backtest + from qlib.contrib.strategy import TopkDropoutStrategy + + # backtest parameters + bparas = {} + bparas['limit_threshold'] = 0.095 + bparas['account'] = 1000000000 + + sparas = {} + sparas['topk'] = 50 + sparas['n_drop'] = 5 + strategy = TopkDropoutStrategy(**sparas) + + report_normal_df, positions = backtest(pred_df, strategy, **bparas) + + pred_df_dates = pred_df.index.get_level_values(level='datetime') + features_df = D.features(D.instruments('csi500'), ['Ref($close, -1)/$close - 1'], pred_df_dates.min(), pred_df_dates.max()) + features_df.columns = ['label'] + + qcr.cumulative_return_graph(positions, report_normal_df, features_df) + + + Graph desc: + - Axis X: Trading day + - Axis Y: + - Above axis Y: (((Ref($close, -1)/$close - 1) * weight).sum() / weight.sum()).cumsum() + - Below axis Y: Daily weight sum + - In the sell graph, y < 0 stands for profit; in other cases, y > 0 stands for profit. + - In the buy_minus_sell graph, the y value of the weight graph at the bottom is buy_weight + sell_weight. + - In each graph, the red line in the histogram on the right represents the average. + + :param position: position data + :param report_normal: + + + .. code-block:: python + + return cost bench turnover + date + 2017-01-04 0.003421 0.000864 0.011693 0.576325 + 2017-01-05 0.000508 0.000447 0.000721 0.227882 + 2017-01-06 -0.003321 0.000212 -0.004322 0.102765 + 2017-01-09 0.006753 0.000212 0.006874 0.105864 + 2017-01-10 -0.000416 0.000440 -0.003350 0.208396 + + + :param label_data: `D.features` result; index is `pd.MultiIndex`, index name is [`instrument`, `datetime`]; columns names is [`label`]. + **The ``label`` T is the change from T to T+1**, it is recommended to use ``close``, example: D.features(D.instruments('csi500'), ['Ref($close, -1)/$close-1']) + + + .. code-block:: python + + label + instrument datetime + SH600004 2017-12-11 -0.013502 + 2017-12-12 -0.072367 + 2017-12-13 -0.068605 + 2017-12-14 0.012440 + 2017-12-15 -0.102778 + + + :param show_notebook: True or False. If True, show graph in notebook, else return figures + :param start_date: start date + :param end_date: end date + :return: + """ + position = copy.deepcopy(position) + report_normal = report_normal.copy() + label_data.columns = ["label"] + _figures = _get_figure_with_position( + position, report_normal, label_data, start_date, end_date + ) + if show_notebook: + BaseGraph.show_graph_in_notebook(_figures) + else: + return _figures diff --git a/qlib/contrib/report/analysis_position/parse_position.py b/qlib/contrib/report/analysis_position/parse_position.py new file mode 100644 index 000000000..c3a7807e3 --- /dev/null +++ b/qlib/contrib/report/analysis_position/parse_position.py @@ -0,0 +1,187 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import pandas as pd + + +from ...backtest.profit_attribution import get_stock_weight_df + + +def parse_position(position: dict = None) -> pd.DataFrame: + """Parse position dict to position DataFrame + + :param position: position data + :return: position DataFrame; + + + .. code-block:: python + + position_df = parse_position(positions) + print(position_df.head()) + # status: 0-hold, -1-sell, 1-buy + + amount cash count price status weight + instrument datetime + SZ000547 2017-01-04 44.154290 211405.285654 1 205.189575 1 0.031255 + SZ300202 2017-01-04 60.638845 211405.285654 1 154.356506 1 0.032290 + SH600158 2017-01-04 46.531681 211405.285654 1 153.895142 1 0.024704 + SH600545 2017-01-04 197.173093 211405.285654 1 48.607037 1 0.033063 + SZ000930 2017-01-04 103.938300 211405.285654 1 80.759453 1 0.028958 + + + """ + + position_weight_df = get_stock_weight_df(position) + # If the day does not exist, use the last weight + position_weight_df.fillna(method="ffill", inplace=True) + + previous_data = {"date": None, "code_list": []} + + result_df = pd.DataFrame() + for _trading_date, _value in position.items(): + # pd_date type: pd.Timestamp + _cash = _value.pop("cash") + for _item in ["today_account_value"]: + if _item in _value: + _value.pop(_item) + + _trading_day_df = pd.DataFrame.from_dict(_value, orient="index") + _trading_day_df["weight"] = position_weight_df.loc[_trading_date] + _trading_day_df["cash"] = _cash + _trading_day_df["date"] = _trading_date + # status: 0-hold, -1-sell, 1-buy + _trading_day_df["status"] = 0 + + # T not exist, T-1 exist, T sell + _cur_day_sell = set(previous_data["code_list"]) - set(_trading_day_df.index) + # T exist, T-1 not exist, T buy + _cur_day_buy = set(_trading_day_df.index) - set(previous_data["code_list"]) + + # Trading day buy + _trading_day_df.loc[_trading_day_df.index.isin(_cur_day_buy), "status"] = 1 + + # Trading day sell + if not result_df.empty: + _trading_day_sell_df = result_df.loc[ + (result_df["date"] == previous_data["date"]) + & (result_df.index.isin(_cur_day_sell)) + ].copy() + if not _trading_day_sell_df.empty: + _trading_day_sell_df["status"] = -1 + _trading_day_sell_df["date"] = _trading_date + _trading_day_df = _trading_day_df.append( + _trading_day_sell_df, sort=False + ) + + result_df = result_df.append(_trading_day_df, sort=True) + + previous_data = dict( + date=_trading_date, + code_list=_trading_day_df[_trading_day_df["status"] != -1].index, + ) + + result_df.reset_index(inplace=True) + result_df.rename(columns={"date": "datetime", "index": "instrument"}, inplace=True) + return result_df.set_index(["instrument", "datetime"]) + + +def _add_label_to_position( + position_df: pd.DataFrame, label_data: pd.DataFrame +) -> pd.DataFrame: + """Concat position with custom label + + :param position_df: position DataFrame + :param label_data: + :return: concat result + """ + + _start_time = position_df.index.get_level_values(level="datetime").min() + _end_time = position_df.index.get_level_values(level="datetime").max() + label_data = label_data.loc(axis=0)[:, pd.to_datetime(_start_time) :] + _result_df = pd.concat([position_df, label_data], axis=1, sort=True).reindex( + label_data.index + ) + _result_df = _result_df.loc[_result_df.index.get_level_values(1) <= _end_time] + return _result_df + + +def _add_bench_to_position( + position_df: pd.DataFrame = None, bench: pd.Series = None +) -> pd.DataFrame: + """Concat position with bench + + :param position_df: position DataFrame + :param bench: report normal data + :return: concat result + """ + _temp_df = position_df.reset_index(level="instrument") + # FIXME: After the stock is bought and sold, the rise and fall of the next trading day are calculated. + _temp_df["bench"] = bench.shift(-1) + res_df = _temp_df.set_index(["instrument", _temp_df.index]) + return res_df + + +def _calculate_label_rank(df: pd.DataFrame) -> pd.DataFrame: + """calculate label rank + + :param df: + :return: + """ + _label_name = "label" + + def _calculate_day_value(g_df: pd.DataFrame): + g_df = g_df.copy() + g_df["rank_ratio"] = g_df[_label_name].rank(ascending=False) / len(g_df) * 100 + + # Sell: -1, Hold: 0, Buy: 1 + for i in [-1, 0, 1]: + g_df.loc[g_df["status"] == i, "rank_label_mean"] = g_df[ + g_df["status"] == i + ]["rank_ratio"].mean() + + g_df["excess_return"] = g_df[_label_name] - g_df[_label_name].mean() + return g_df + + return df.groupby(level="datetime").apply(_calculate_day_value) + + +def get_position_data( + position: dict, + label_data: pd.DataFrame, + report_normal: pd.DataFrame = None, + calculate_label_rank=False, + start_date=None, + end_date=None, +) -> pd.DataFrame: + """Concat position data with pred/report_normal + + :param position: position data + :param report_normal: report normal, must be container 'bench' column + :param label_data: + :param calculate_label_rank: + :param start_date: start date + :param end_date: end date + :return: concat result, + columns: ['amount', 'cash', 'count', 'price', 'status', 'weight', 'label', + 'rank_ratio', 'rank_label_mean', 'excess_return', 'score', 'bench'] + index: ['instrument', 'date'] + """ + _position_df = parse_position(position) + + # Add custom_label, rank_ratio, rank_mean, and excess_return field + _position_df = _add_label_to_position(_position_df, label_data) + + if calculate_label_rank: + _position_df = _calculate_label_rank(_position_df) + + if report_normal is not None: + # Add bench field + _position_df = _add_bench_to_position(_position_df, report_normal["bench"]) + + _date_list = _position_df.index.get_level_values(level="datetime") + start_date = _date_list.min() if start_date is None else start_date + end_date = _date_list.max() if end_date is None else end_date + _position_df = _position_df.loc[ + (start_date <= _date_list) & (_date_list <= end_date) + ] + return _position_df diff --git a/qlib/contrib/report/analysis_position/rank_label.py b/qlib/contrib/report/analysis_position/rank_label.py new file mode 100644 index 000000000..6427ac900 --- /dev/null +++ b/qlib/contrib/report/analysis_position/rank_label.py @@ -0,0 +1,127 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import copy +from typing import Iterable + +import pandas as pd +import plotly.graph_objs as go + +from ..graph import ScatterGraph +from ..analysis_position.parse_position import get_position_data + + +def _get_figure_with_position( + position: dict, label_data: pd.DataFrame, start_date=None, end_date=None +) -> Iterable[go.Figure]: + """Get average analysis figures + + :param position: position + :param label_data: + :param start_date: + :param end_date: + :return: + """ + _position_df = get_position_data( + position, + label_data, + calculate_label_rank=True, + start_date=start_date, + end_date=end_date, + ) + + res_dict = dict() + _pos_gp = _position_df.groupby(level=1) + for _item in _pos_gp: + _date = _item[0] + _day_df = _item[1] + + _day_value = res_dict.setdefault(_date, {}) + for _i, _name in {0: "Hold", 1: "Buy", -1: "Sell"}.items(): + _temp_df = _day_df[_day_df["status"] == _i] + if _temp_df.empty: + _day_value[_name] = 0 + else: + _day_value[_name] = _temp_df["rank_label_mean"].values[0] + + _res_df = pd.DataFrame.from_dict(res_dict, orient="index") + # FIXME: support HIGH-FREQ + _res_df.index = _res_df.index.strftime('%Y-%m-%d') + for _col in _res_df.columns: + yield ScatterGraph( + _res_df.loc[:, [_col]], + layout=dict( + title=_col, + xaxis=dict(type="category", tickangle=45), + yaxis=dict(title="lable-rank-ratio: %"), + ), + graph_kwargs=dict(mode="lines+markers"), + ).figure + + +def rank_label_graph( + position: dict, + label_data: pd.DataFrame, + start_date=None, + end_date=None, + show_notebook=True, +) -> Iterable[go.Figure]: + """Ranking percentage of stocks buy, sell, and holding on the trading day. + Average rank-ratio(similar to **sell_df['label'].rank(ascending=False) / len(sell_df)**) of daily trading + + Example: + + + .. code-block:: python + + from qlib.data import D + from qlib.contrib.evaluate import backtest + from qlib.contrib.strategy import TopkDropoutStrategy + + # backtest parameters + bparas = {} + bparas['limit_threshold'] = 0.095 + bparas['account'] = 1000000000 + + sparas = {} + sparas['topk'] = 50 + sparas['n_drop'] = 230 + strategy = TopkDropoutStrategy(**sparas) + + _, positions = backtest(pred_df, strategy, **bparas) + + pred_df_dates = pred_df.index.get_level_values(level='datetime') + features_df = D.features(D.instruments('csi500'), ['Ref($close, -1)/$close-1'], pred_df_dates.min(), pred_df_dates.max()) + features_df.columns = ['label'] + + qcr.rank_label_graph(positions, features_df, pred_df_dates.min(), pred_df_dates.max()) + + + :param position: position data; **qlib.contrib.backtest.backtest.backtest** result + :param label_data: **D.features** result; index is **pd.MultiIndex**, index name is **[instrument, datetime]**; columns names is **[label]**. + **The ``label`` T is the change from T to T+1**, it is recommended to use ``close``, example: D.features(D.instruments('csi500'), ['Ref($close, -1)/$close-1']) + + + .. code-block:: python + + label + instrument datetime + SH600004 2017-12-11 -0.013502 + 2017-12-12 -0.072367 + 2017-12-13 -0.068605 + 2017-12-14 0.012440 + 2017-12-15 -0.102778 + + + :param start_date: start date + :param end_date: end_date + :param show_notebook: **True** or **False**. If True, show graph in notebook, else return figures + :return: + """ + position = copy.deepcopy(position) + label_data.columns = ["label"] + _figures = _get_figure_with_position(position, label_data, start_date, end_date) + if show_notebook: + ScatterGraph.show_graph_in_notebook(_figures) + else: + return _figures diff --git a/qlib/contrib/report/analysis_position/report.py b/qlib/contrib/report/analysis_position/report.py new file mode 100644 index 000000000..fab7dbd5f --- /dev/null +++ b/qlib/contrib/report/analysis_position/report.py @@ -0,0 +1,220 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import pandas as pd + +from ..graph import SubplotsGraph, BaseGraph + + +def _calculate_maximum(df: pd.DataFrame, is_ex: bool = False): + """ + + :param df: + :param is_ex: + :return: + """ + if is_ex: + end_date = df["cum_ex_return_wo_cost_mdd"].idxmin() + start_date = df.loc[df.index <= end_date]["cum_ex_return_wo_cost"].idxmax() + else: + end_date = df["return_wo_mdd"].idxmin() + start_date = df.loc[df.index <= end_date]["cum_return_wo_cost"].idxmax() + return start_date, end_date + + +def _calculate_mdd(series): + """ + Calculate mdd + + :param series: + :return: + """ + return series - series.cummax() + + +def _calculate_report_data(df: pd.DataFrame) -> pd.DataFrame: + """ + + :param df: + :return: + """ + + df.index = df.index.strftime("%Y-%m-%d") + + report_df = pd.DataFrame() + + report_df["cum_bench"] = df["bench"].cumsum() + report_df["cum_return_wo_cost"] = df["return"].cumsum() + report_df["cum_return_w_cost"] = (df["return"] - df["cost"]).cumsum() + # report_df['cum_return'] - report_df['cum_return'].cummax() + report_df["return_wo_mdd"] = _calculate_mdd(report_df["cum_return_wo_cost"]) + report_df["return_w_cost_mdd"] = _calculate_mdd( + (df["return"] - df["cost"]).cumsum() + ) + + report_df["cum_ex_return_wo_cost"] = (df["return"] - df["bench"]).cumsum() + report_df["cum_ex_return_w_cost"] = ( + df["return"] - df["bench"] - df["cost"] + ).cumsum() + report_df["cum_ex_return_wo_cost_mdd"] = _calculate_mdd( + (df["return"] - df["bench"]).cumsum() + ) + report_df["cum_ex_return_w_cost_mdd"] = _calculate_mdd( + (df["return"] - df["cost"] - df["bench"]).cumsum() + ) + # return_wo_mdd , return_w_cost_mdd, cum_ex_return_wo_cost_mdd, cum_ex_return_w + + report_df["turnover"] = df["turnover"] + report_df.sort_index(ascending=True, inplace=True) + return report_df + + +def _report_figure(df: pd.DataFrame) -> [list, tuple]: + """ + + :param df: + :return: + """ + + # Get data + report_df = _calculate_report_data(df) + + # Maximum Drawdown + max_start_date, max_end_date = _calculate_maximum(report_df) + ex_max_start_date, ex_max_end_date = _calculate_maximum(report_df, True) + + _temp_df = report_df.reset_index() + _temp_df.loc[-1] = 0 + _temp_df = _temp_df.shift(1) + _temp_df.loc[0, "index"] = "T0" + _temp_df.set_index("index", inplace=True) + _temp_df.iloc[0] = 0 + report_df = _temp_df + + # Create figure + _default_kind_map = dict(kind="ScatterGraph", kwargs={"mode": "lines+markers"}) + _temp_fill_args = {"fill": "tozeroy", "mode": "lines+markers"} + _column_row_col_dict = [ + ("cum_bench", dict(row=1, col=1)), + ("cum_return_wo_cost", dict(row=1, col=1)), + ("cum_return_w_cost", dict(row=1, col=1)), + ("return_wo_mdd", dict(row=2, col=1, graph_kwargs=_temp_fill_args)), + ("return_w_cost_mdd", dict(row=3, col=1, graph_kwargs=_temp_fill_args)), + ("cum_ex_return_wo_cost", dict(row=4, col=1)), + ("cum_ex_return_w_cost", dict(row=4, col=1)), + ("turnover", dict(row=5, col=1)), + ("cum_ex_return_w_cost_mdd", dict(row=6, col=1, graph_kwargs=_temp_fill_args)), + ("cum_ex_return_wo_cost_mdd", dict(row=7, col=1, graph_kwargs=_temp_fill_args)), + ] + + _subplot_layout = dict( + xaxis=dict(showline=True, type="category", tickangle=45), + yaxis=dict(zeroline=True, showline=True, showticklabels=True), + ) + for i in range(2, 8): + # yaxis + _subplot_layout.update( + { + "yaxis{}".format(i): dict( + zeroline=True, showline=True, showticklabels=True + ) + } + ) + _layout_style = dict( + height=1200, + title=" ", + shapes=[ + { + "type": "rect", + "xref": "x", + "yref": "paper", + "x0": max_start_date, + "y0": 0.55, + "x1": max_end_date, + "y1": 1, + "fillcolor": "#d3d3d3", + "opacity": 0.3, + "line": {"width": 0,}, + }, + { + "type": "rect", + "xref": "x", + "yref": "paper", + "x0": ex_max_start_date, + "y0": 0, + "x1": ex_max_end_date, + "y1": 0.55, + "fillcolor": "#d3d3d3", + "opacity": 0.3, + "line": {"width": 0,}, + }, + ], + ) + + _subplot_kwargs = dict( + shared_xaxes=True, + vertical_spacing=0.01, + rows=7, + cols=1, + row_width=[1, 1, 1, 3, 1, 1, 3], + print_grid=False, + ) + figure = SubplotsGraph( + df=report_df, + layout=_layout_style, + sub_graph_data=_column_row_col_dict, + subplots_kwargs=_subplot_kwargs, + kind_map=_default_kind_map, + sub_graph_layout=_subplot_layout, + ).figure + return (figure,) + + +def report_graph(report_df: pd.DataFrame, show_notebook: bool = True) -> [list, tuple]: + """display backtest report + + Example: + + + .. code-block:: python + + from qlib.contrib.evaluate import backtest + from qlib.contrib.strategy import TopkDropoutStrategy + + # backtest parameters + bparas = {} + bparas['limit_threshold'] = 0.095 + bparas['account'] = 1000000000 + + sparas = {} + sparas['topk'] = 50 + sparas['n_drop'] = 230 + strategy = TopkDropoutStrategy(**sparas) + + report_normal_df, _ = backtest(pred_df, strategy, **bparas) + + qcr.report_graph(report_normal_df) + + :param report_df: **df.index.name** must be **date**, **df.columns** must contain **return**, **turnover**, **cost**, **bench** + + + .. code-block:: python + + return cost bench turnover + date + 2017-01-04 0.003421 0.000864 0.011693 0.576325 + 2017-01-05 0.000508 0.000447 0.000721 0.227882 + 2017-01-06 -0.003321 0.000212 -0.004322 0.102765 + 2017-01-09 0.006753 0.000212 0.006874 0.105864 + 2017-01-10 -0.000416 0.000440 -0.003350 0.208396 + + + :param show_notebook: whether to display graphics in notebook, the default is **True** + :return: if show_notebook is True, display in notebook; else return **plotly.graph_objs.Figure** list + """ + report_df = report_df.copy() + fig_list = _report_figure(report_df) + if show_notebook: + BaseGraph.show_graph_in_notebook(fig_list) + else: + return fig_list diff --git a/qlib/contrib/report/analysis_position/risk_analysis.py b/qlib/contrib/report/analysis_position/risk_analysis.py new file mode 100644 index 000000000..300974195 --- /dev/null +++ b/qlib/contrib/report/analysis_position/risk_analysis.py @@ -0,0 +1,271 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from typing import Iterable + +import pandas as pd + +import plotly.graph_objs as py + +from ...evaluate import risk_analysis + +from ..graph import SubplotsGraph, ScatterGraph + + +def _get_risk_analysis_data_with_report( + report_normal_df: pd.DataFrame, + # report_long_short_df: pd.DataFrame, + date: pd.Timestamp, +) -> pd.DataFrame: + """Get risk analysis data with report + + :param report_normal_df: report data + :param report_long_short_df: report data + :param date: date string + :return: + """ + + analysis = dict() + # if not report_long_short_df.empty: + # analysis["pred_long"] = risk_analysis(report_long_short_df["long"]) + # analysis["pred_short"] = risk_analysis(report_long_short_df["short"]) + # analysis["pred_long_short"] = risk_analysis(report_long_short_df["long_short"]) + + if not report_normal_df.empty: + analysis["sub_bench"] = risk_analysis( + report_normal_df["return"] - report_normal_df["bench"] + ) + analysis["sub_cost"] = risk_analysis( + report_normal_df["return"] + - report_normal_df["bench"] + - report_normal_df["cost"] + ) + analysis_df = pd.concat(analysis) # type: pd.DataFrame + analysis_df["date"] = date + return analysis_df + + +def _get_all_risk_analysis(risk_df: pd.DataFrame) -> pd.DataFrame: + """risk_df to standard + + :param risk_df: risk data + :return: + """ + if risk_df is None: + return pd.DataFrame() + risk_df = risk_df.unstack() + risk_df.columns = risk_df.columns.droplevel(0) + return risk_df.drop("mean", axis=1) + + +def _get_monthly_risk_analysis_with_report(report_normal_df: pd.DataFrame) -> pd.DataFrame: + """Get monthly analysis data + + :param report_normal_df: + # :param report_long_short_df: + :return: + """ + + # Group by month + report_normal_gp = report_normal_df.groupby( + [report_normal_df.index.year, report_normal_df.index.month] + ) + # report_long_short_gp = report_long_short_df.groupby( + # [report_long_short_df.index.year, report_long_short_df.index.month] + # ) + + gp_month = sorted(set(report_normal_gp.size().index)) + + _monthly_df = pd.DataFrame() + for gp_m in gp_month: + _m_report_normal = report_normal_gp.get_group(gp_m) + # _m_report_long_short = report_long_short_gp.get_group(gp_m) + + if len(_m_report_normal) < 3: + # The month's data is less than 3, not displayed + # FIXME: If the trading day of a month is less than 3 days, a breakpoint will appear in the graph + continue + month_days = pd.Timestamp(year=gp_m[0], month=gp_m[1], day=1).days_in_month + _temp_df = _get_risk_analysis_data_with_report( + _m_report_normal, + # _m_report_long_short, + pd.Timestamp(year=gp_m[0], month=gp_m[1], day=month_days), + ) + _monthly_df = _monthly_df.append(_temp_df, sort=False) + + return _monthly_df + + +def _get_monthly_analysis_with_feature( + monthly_df: pd.DataFrame, feature: str = "annual" +) -> pd.DataFrame: + """ + + :param monthly_df: + :param feature: + :return: + """ + _monthly_df_gp = monthly_df.reset_index().groupby(["level_1"]) + + _name_df = _monthly_df_gp.get_group(feature).set_index(["level_0", "level_1"]) + _temp_df = _name_df.pivot_table( + index="date", values=["risk"], columns=_name_df.index + ) + _temp_df.columns = map(lambda x: "_".join(x[-1]), _temp_df.columns) + _temp_df.index = _temp_df.index.strftime("%Y-%m") + + return _temp_df + + +def _get_risk_analysis_figure(analysis_df: pd.DataFrame) -> Iterable[py.Figure]: + """Get analysis graph figure + + :param analysis_df: + :return: + """ + if analysis_df is None: + return [] + + _figure = SubplotsGraph( + _get_all_risk_analysis(analysis_df), kind_map=dict(kind="BarGraph", kwargs={}) + ).figure + return (_figure,) + + +def _get_monthly_risk_analysis_figure(report_normal_df: pd.DataFrame) -> Iterable[py.Figure]: + """Get analysis monthly graph figure + + :param report_normal_df: + :param report_long_short_df: + :return: + """ + + # if report_normal_df is None and report_long_short_df is None: + # return [] + if report_normal_df is None: + return [] + + # if report_normal_df is None: + # report_normal_df = pd.DataFrame(index=report_long_short_df.index) + + # if report_long_short_df is None: + # report_long_short_df = pd.DataFrame(index=report_normal_df.index) + + _monthly_df = _get_monthly_risk_analysis_with_report( + report_normal_df=report_normal_df, + # report_long_short_df=report_long_short_df, + ) + + for _feature in ["annual", "mdd", "sharpe", "std"]: + _temp_df = _get_monthly_analysis_with_feature(_monthly_df, _feature) + yield ScatterGraph( + _temp_df, + layout=dict(title=_feature, xaxis=dict(type="category", tickangle=45)), + graph_kwargs={"mode": "lines+markers"}, + ).figure + + +def risk_analysis_graph( + analysis_df: pd.DataFrame = None, + report_normal_df: pd.DataFrame = None, + report_long_short_df: pd.DataFrame = None, + show_notebook: bool = True, +) -> Iterable[py.Figure]: + """Generate analysis graph and monthly analysis + + Example: + + + .. code-block:: python + + from qlib.contrib.evaluate import risk_analysis, backtest, long_short_backtest + from qlib.contrib.strategy import TopkDropoutStrategy + from qlib.contrib.report import analysis_position + + # backtest parameters + bparas = {} + bparas['limit_threshold'] = 0.095 + bparas['account'] = 1000000000 + + sparas = {} + sparas['topk'] = 50 + sparas['n_drop'] = 230 + strategy = TopkDropoutStrategy(**sparas) + + report_normal_df, positions = backtest(pred_df, strategy, **bparas) + # long_short_map = long_short_backtest(pred_df) + # report_long_short_df = pd.DataFrame(long_short_map) + + analysis = dict() + # analysis['pred_long'] = risk_analysis(report_long_short_df['long']) + # analysis['pred_short'] = risk_analysis(report_long_short_df['short']) + # analysis['pred_long_short'] = risk_analysis(report_long_short_df['long_short']) + analysis['sub_bench'] = risk_analysis(report_normal_df['return'] - report_normal_df['bench']) + analysis['sub_cost'] = risk_analysis(report_normal_df['return'] - report_normal_df['bench'] - report_normal_df['cost']) + analysis_df = pd.concat(analysis) + + analysis_position.risk_analysis_graph(analysis_df, report_normal_df) + + + + :param analysis_df: analysis data, index is **pd.MultiIndex**; columns names is **[risk]**. + + + .. code-block:: python + + risk + sub_bench mean 0.000662 + std 0.004487 + annual 0.166720 + sharpe 2.340526 + mdd -0.080516 + sub_cost mean 0.000577 + std 0.004482 + annual 0.145392 + sharpe 2.043494 + mdd -0.083584 + + + :param report_normal_df: **df.index.name** must be **date**, df.columns must contain **return**, **turnover**, **cost**, **bench** + + + .. code-block:: python + + return cost bench turnover + date + 2017-01-04 0.003421 0.000864 0.011693 0.576325 + 2017-01-05 0.000508 0.000447 0.000721 0.227882 + 2017-01-06 -0.003321 0.000212 -0.004322 0.102765 + 2017-01-09 0.006753 0.000212 0.006874 0.105864 + 2017-01-10 -0.000416 0.000440 -0.003350 0.208396 + + + :param report_long_short_df: **df.index.name** must be **date**, df.columns contain **long**, **short**, **long_short** + + + .. code-block:: python + + long short long_short + date + 2017-01-04 -0.001360 0.001394 0.000034 + 2017-01-05 0.002456 0.000058 0.002514 + 2017-01-06 0.000120 0.002739 0.002859 + 2017-01-09 0.001436 0.001838 0.003273 + 2017-01-10 0.000824 -0.001944 -0.001120 + + + :param show_notebook: Whether to display graphics in a notebook, default **True** + If True, show graph in notebook + If False, return graph figure + :return: + """ + _figure_list = list(_get_risk_analysis_figure(analysis_df)) + list( + _get_monthly_risk_analysis_figure( + report_normal_df, + # report_long_short_df, + ) + ) + if show_notebook: + ScatterGraph.show_graph_in_notebook(_figure_list) + else: + return _figure_list diff --git a/qlib/contrib/report/analysis_position/score_ic.py b/qlib/contrib/report/analysis_position/score_ic.py new file mode 100644 index 000000000..bc6f8f5ff --- /dev/null +++ b/qlib/contrib/report/analysis_position/score_ic.py @@ -0,0 +1,72 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import pandas as pd + +from ..graph import ScatterGraph + + +def _get_score_ic(pred_label: pd.DataFrame): + """ + + :param pred_label: + :return: + """ + concat_data = pred_label.copy() + concat_data.dropna(axis=0, how="any", inplace=True) + _ic = concat_data.groupby(level="datetime").apply( + lambda x: x["label"].corr(x["score"]) + ) + _rank_ic = concat_data.groupby(level="datetime").apply( + lambda x: x["label"].corr(x["score"], method="spearman") + ) + return pd.DataFrame({"ic": _ic, "rank_ic": _rank_ic}) + + +def score_ic_graph( + pred_label: pd.DataFrame, show_notebook: bool = True +) -> [list, tuple]: + """score IC + + Example: + + + .. code-block:: python + + from qlib.data import D + from qlib.contrib.report import analysis_position + pred_df_dates = pred_df.index.get_level_values(level='datetime') + features_df = D.features(D.instruments('csi500'), ['Ref($close, -2)/Ref($close, -1)-1'], pred_df_dates.min(), pred_df_dates.max()) + features_df.columns = ['label'] + pred_label = pd.concat([features_df, pred], axis=1, sort=True).reindex(features_df.index) + analysis_position.score_ic_graph(pred_label) + + + :param pred_label: index is **pd.MultiIndex**, index name is **[instrument, datetime]**; columns names is **[score, label]** + + + .. code-block:: python + + instrument datetime score label + SH600004 2017-12-11 -0.013502 -0.013502 + 2017-12-12 -0.072367 -0.072367 + 2017-12-13 -0.068605 -0.068605 + 2017-12-14 0.012440 0.012440 + 2017-12-15 -0.102778 -0.102778 + + + :param show_notebook: whether to display graphics in notebook, the default is **True** + :return: if show_notebook is True, display in notebook; else return **plotly.graph_objs.Figure** list + """ + _ic_df = _get_score_ic(pred_label) + # FIXME: support HIGH-FREQ + _ic_df.index = _ic_df.index.strftime("%Y-%m-%d") + _figure = ScatterGraph( + _ic_df, + layout=dict(title="Score IC", xaxis=dict(type="category", tickangle=45)), + graph_kwargs={"mode": "lines+markers"}, + ).figure + if show_notebook: + ScatterGraph.show_graph_in_notebook([_figure]) + else: + return (_figure,) diff --git a/qlib/contrib/report/graph.py b/qlib/contrib/report/graph.py new file mode 100644 index 000000000..082eafa49 --- /dev/null +++ b/qlib/contrib/report/graph.py @@ -0,0 +1,370 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import math +import importlib +from pathlib import Path +from typing import Iterable + +import pandas as pd + +import plotly.offline as py +import plotly.graph_objs as go + +from plotly.tools import make_subplots +from plotly.figure_factory import create_distplot + +from ...utils import get_module_by_module_path + + +class BaseGraph(object): + """""" + + _name = None + + def __init__( + self, df: pd.DataFrame = None, layout: dict = None, graph_kwargs: dict = None, name_dict: dict = None, **kwargs + ): + """ + + :param df: + :param layout: + :param graph_kwargs: + :param name_dict: + :param kwargs: + layout: dict + go.Layout parameters + graph_kwargs: dict + Graph parameters, eg: go.Bar(**graph_kwargs) + """ + self._df = df + + self._layout = dict() if layout is None else layout + self._graph_kwargs = dict() if graph_kwargs is None else graph_kwargs + self._name_dict = name_dict + + self.data = None + + self._init_parameters(**kwargs) + self._init_data() + + def _init_data(self): + """ + + :return: + """ + if self._df.empty: + raise ValueError("df is empty.") + + self.data = self._get_data() + + def _init_parameters(self, **kwargs): + """ + + :param kwargs + """ + + # Instantiate graphics parameters + self._graph_type = self._name.lower().capitalize() + + # Displayed column name + if self._name_dict is None: + self._name_dict = {_item: _item for _item in self._df.columns} + + @staticmethod + def get_instance_with_graph_parameters(graph_type: str = None, **kwargs): + """ + + :param graph_type: + :param kwargs: + :return: + """ + try: + _graph_module = importlib.import_module("plotly.graph_objs") + _graph_class = getattr(_graph_module, graph_type) + except AttributeError: + _graph_module = importlib.import_module("qlib.contrib.report.graph") + _graph_class = getattr(_graph_module, graph_type) + return _graph_class(**kwargs) + + @staticmethod + def show_graph_in_notebook(figure_list: Iterable[go.Figure] = None): + """ + + :param figure_list: + :return: + """ + py.init_notebook_mode() + for _fig in figure_list: + py.iplot(_fig) + + def _get_layout(self) -> go.Layout: + """ + + :return: + """ + return go.Layout(**self._layout) + + def _get_data(self) -> list: + """ + + :return: + """ + + _data = [ + self.get_instance_with_graph_parameters( + graph_type=self._graph_type, x=self._df.index, y=self._df[_col], name=_name, **self._graph_kwargs + ) + for _col, _name in self._name_dict.items() + ] + return _data + + @property + def figure(self) -> go.Figure: + """ + + :return: + """ + return go.Figure(data=self.data, layout=self._get_layout()) + + +class ScatterGraph(BaseGraph): + _name = "scatter" + + +class BarGraph(BaseGraph): + _name = "bar" + + +class DistplotGraph(BaseGraph): + _name = "distplot" + + def _get_data(self): + """ + + :return: + """ + _t_df = self._df.dropna() + _data_list = [_t_df[_col] for _col in self._name_dict] + _label_list = [_name for _name in self._name_dict.values()] + _fig = create_distplot(_data_list, _label_list, show_rug=False, **self._graph_kwargs) + + return _fig["data"] + + +class HeatmapGraph(BaseGraph): + _name = "heatmap" + + def _get_data(self): + """ + + :return: + """ + _data = [ + self.get_instance_with_graph_parameters( + graph_type=self._graph_type, + x=self._df.columns, + y=self._df.index, + z=self._df.values.tolist(), + **self._graph_kwargs + ) + ] + return _data + + +class HistogramGraph(BaseGraph): + _name = "histogram" + + def _get_data(self): + """ + + :return: + """ + _data = [ + self.get_instance_with_graph_parameters( + graph_type=self._graph_type, x=self._df[_col], name=_name, **self._graph_kwargs + ) + for _col, _name in self._name_dict.items() + ] + return _data + + +class SubplotsGraph(object): + """Create subplots same as df.plot(subplots=True) + + Simple package for `plotly.tools.subplots` + """ + + def __init__( + self, + df: pd.DataFrame = None, + kind_map: dict = None, + layout: dict = None, + sub_graph_layout: dict = None, + sub_graph_data: list = None, + subplots_kwargs: dict = None, + **kwargs + ): + """ + + :param df: pd.DataFrame + + :param kind_map: dict, subplots graph kind and kwargs + eg: dict(kind='ScatterGraph', kwargs=dict()) + + :param layout: `go.Layout` parameters + + :param sub_graph_layout: Layout of each graphic, similar to 'layout' + + :param sub_graph_data: Instantiation parameters for each sub-graphic + eg: [(column_name, instance_parameters), ] + + column_name: str or go.Figure + + Instance_parameters: + + - row: int, the row where the graph is located + + - col: int, the col where the graph is located + + - name: str, show name, default column_name in 'df' + + - kind: str, graph kind, default `kind` param, eg: bar, scatter, ... + + - graph_kwargs: dict, graph kwargs, default {}, used in `go.Bar(**graph_kwargs)` + + :param subplots_kwargs: `plotly.tools.make_subplots` original parameters + + - shared_xaxes: bool, default False + + - shared_yaxes: bool, default False + + - vertical_spacing: float, default 0.3 / rows + + - subplot_titles: list, default [] + If `sub_graph_data` is None, will generate 'subplot_titles' according to `df.columns`, + this field will be discarded + + + - specs: list, see `make_subplots` docs + + - rows: int, Number of rows in the subplot grid, default 1 + If `sub_graph_data` is None, will generate 'rows' according to `df`, this field will be discarded + + - cols: int, Number of cols in the subplot grid, default 1 + If `sub_graph_data` is None, will generate 'cols' according to `df`, this field will be discarded + + + :param kwargs: + + """ + + self._df = df + self._layout = layout + self._sub_graph_layout = sub_graph_layout + + self._kind_map = kind_map + if self._kind_map is None: + self._kind_map = dict(kind="ScatterGraph", kwargs=dict()) + + self._subplots_kwargs = subplots_kwargs + if self._subplots_kwargs is None: + self._init_subplots_kwargs() + + self.__cols = self._subplots_kwargs.get("cols", 2) + self.__rows = self._subplots_kwargs.get("rows", math.ceil(len(self._df.columns) / self.__cols)) + + self._sub_graph_data = sub_graph_data + if self._sub_graph_data is None: + self._init_sub_graph_data() + + self._init_figure() + + def _init_sub_graph_data(self): + """ + + :return: + """ + self._sub_graph_data = list() + self._subplot_titles = list() + + for i, column_name in enumerate(self._df.columns): + row = math.ceil((i + 1) / self.__cols) + _temp = (i + 1) % self.__cols + col = _temp if _temp else self.__cols + res_name = column_name.replace("_", " ") + _temp_row_data = ( + column_name, + dict( + row=row, + col=col, + name=res_name, + kind=self._kind_map["kind"], + graph_kwargs=self._kind_map["kwargs"], + ), + ) + self._sub_graph_data.append(_temp_row_data) + self._subplot_titles.append(res_name) + + def _init_subplots_kwargs(self): + """ + + :return: + """ + # Default cols, rows + _cols = 2 + _rows = math.ceil(len(self._df.columns) / 2) + self._subplots_kwargs = dict() + self._subplots_kwargs["rows"] = _rows + self._subplots_kwargs["cols"] = _cols + self._subplots_kwargs["shared_xaxes"] = False + self._subplots_kwargs["shared_yaxes"] = False + self._subplots_kwargs["vertical_spacing"] = 0.3 / _rows + self._subplots_kwargs["print_grid"] = False + self._subplots_kwargs["subplot_titles"] = self._df.columns.tolist() + + def _init_figure(self): + """ + + :return: + """ + self._figure = make_subplots(**self._subplots_kwargs) + + for column_name, column_map in self._sub_graph_data: + if isinstance(column_name, go.Figure): + _graph_obj = column_name + elif isinstance(column_name, str): + temp_name = column_map.get("name", column_name.replace("_", " ")) + kind = column_map.get("kind", self._kind_map.get("kind", "ScatterGraph")) + _graph_kwargs = column_map.get("graph_kwargs", self._kind_map.get("kwargs", {})) + _graph_obj = BaseGraph.get_instance_with_graph_parameters( + kind, + **dict( + df=self._df.loc[:, [column_name]], + name_dict={column_name: temp_name}, + graph_kwargs=_graph_kwargs, + ) + ) + else: + raise TypeError() + + row = column_map["row"] + col = column_map["col"] + + _graph_data = getattr(_graph_obj, "data") + # for _item in _graph_data: + # _item.pop('xaxis', None) + # _item.pop('yaxis', None) + + for _g_obj in _graph_data: + self._figure.append_trace(_g_obj, row=row, col=col) + + if self._sub_graph_layout is not None: + for k, v in self._sub_graph_layout.items(): + self._figure["layout"][k].update(v) + + self._figure["layout"].update(self._layout) + + @property + def figure(self): + return self._figure diff --git a/qlib/contrib/strategy/__init__.py b/qlib/contrib/strategy/__init__.py new file mode 100644 index 000000000..6c2e4ceed --- /dev/null +++ b/qlib/contrib/strategy/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from .strategy import ( + TopkDropoutStrategy, + BaseStrategy, + WeightStrategyBase, +) diff --git a/qlib/contrib/strategy/cost_control.py b/qlib/contrib/strategy/cost_control.py new file mode 100644 index 000000000..dd90437b0 --- /dev/null +++ b/qlib/contrib/strategy/cost_control.py @@ -0,0 +1,73 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from .strategy import StrategyWrapper, WeightStrategyBase +import copy + + +class SoftTopkStrategy(WeightStrategyBase): + def __init__(self, topk, max_sold_weight=1.0, risk_degree=0.95, buy_method="first_fill"): + """Parameter + topk : int + top-N stocks to buy + risk_degree : float + position percentage of total value + buy_method : + rank_fill: assign the weight stocks that rank high first(1/topk max) + average_fill: assign the weight to the stocks rank high averagely. + """ + super().__init__() + self.topk = topk + self.max_sold_weight = max_sold_weight + self.risk_degree = risk_degree + self.buy_method = buy_method + + def get_risk_degree(self, date): + """get_risk_degree + Return the proportion of your total value you will used in investment. + Dynamically risk_degree will result in Market timing + """ + # It will use 95% amoutn of your total value by default + return self.risk_degree + + def generate_target_weight_position(self, score, current, trade_date): + """Parameter: + score : pred score for this trade date, pd.Series, index is stock_id, contain 'score' column + current : current position, use Position() class + trade_date : trade date + generate target position from score for this date and the current position + The cache is not considered in the position + """ + # TODO: + # If the current stock list is more than topk(eg. The weights are modified + # by risk control), the weight will not be handled correctly. + buy_signal_stocks = set(score.sort_values(ascending=False).iloc[: self.topk].index) + cur_stock_weight = current.get_stock_weight_dict(only_stock=True) + + if len(cur_stock_weight) == 0: + final_stock_weight = {code: 1 / self.topk for code in buy_signal_stocks} + else: + final_stock_weight = copy.deepcopy(cur_stock_weight) + sold_stock_weight = 0.0 + for stock_id in final_stock_weight: + if stock_id not in buy_signal_stocks: + sw = min(self.max_sold_weight, final_stock_weight[stock_id]) + sold_stock_weight += sw + final_stock_weight[stock_id] -= sw + if self.buy_method == "first_fill": + for stock_id in buy_signal_stocks: + add_weight = min( + max(1 / self.topk - final_stock_weight.get(stock_id, 0), 0.0), + sold_stock_weight, + ) + final_stock_weight[stock_id] = final_stock_weight.get(stock_id, 0.0) + add_weight + sold_stock_weight -= add_weight + elif self.buy_method == "average_fill": + for stock_id in buy_signal_stocks: + final_stock_weight[stock_id] = final_stock_weight.get(stock_id, 0.0) + sold_stock_weight / len( + buy_signal_stocks + ) + else: + raise ValueError("Buy method not found") + return final_stock_weight diff --git a/qlib/contrib/strategy/order_generator.py b/qlib/contrib/strategy/order_generator.py new file mode 100644 index 000000000..494981ecc --- /dev/null +++ b/qlib/contrib/strategy/order_generator.py @@ -0,0 +1,171 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This order generator is for strategies based on WeightStrategyBase +""" +from ..backtest.position import Position +from ..backtest.exchange import Exchange +import pandas as pd +import copy + + +class OrderGenerator: + def generate_order_list_from_target_weight_position( + self, + current: Position, + trade_exchange: Exchange, + target_weight_position: dict, + risk_degree: float, + pred_date: pd.Timestamp, + trade_date: pd.Timestamp, + ) -> list: + """generate_order_list_from_target_weight_position + + :param current: The current position + :type current: Position + :param trade_exchange: + :type trade_exchange: Exchange + :param target_weight_position: {stock_id : weight} + :type target_weight_position: dict + :param risk_degree: + :type risk_degree: float + :param pred_date: the date the score is predicted + :type pred_date: pd.Timestamp + :param trade_date: the date the stock is traded + :type trade_date: pd.Timestamp + + :rtype: list + """ + raise NotImplementedError() + + +class OrderGenWInteract(OrderGenerator): + """Order Generator With Interact""" + + def generate_order_list_from_target_weight_position( + self, + current: Position, + trade_exchange: Exchange, + target_weight_position: dict, + risk_degree: float, + pred_date: pd.Timestamp, + trade_date: pd.Timestamp, + ) -> list: + """generate_order_list_from_target_weight_position + + No adjustment for for the nontradable share. + All the tadable value is assigned to the tadable stock according to the weight. + if interact == True, will use the price at trade date to generate order list + else, will only use the price before the trade date to generate order list + + :param current: + :type current: Position + :param trade_exchange: + :type trade_exchange: Exchange + :param target_weight_position: + :type target_weight_position: dict + :param risk_degree: + :type risk_degree: float + :param pred_date: + :type pred_date: pd.Timestamp + :param trade_date: + :type trade_date: pd.Timestamp + + :rtype: list + """ + # calculate current_tradable_value + current_amount_dict = current.get_stock_amount_dict() + current_total_value = trade_exchange.calculate_amount_position_value( + amount_dict=current_amount_dict, trade_date=trade_date, only_tradable=False + ) + current_tradable_value = trade_exchange.calculate_amount_position_value( + amount_dict=current_amount_dict, trade_date=trade_date, only_tradable=True + ) + # add cash + current_tradable_value += current.get_cash() + + reserved_cash = (1.0 - risk_degree) * (current_total_value + current.get_cash()) + current_tradable_value -= reserved_cash + + if current_tradable_value < 0: + # if you sell all the tradable stock can not meet the reserved + # value. Then just sell all the stocks + target_amount_dict = copy.deepcopy(current_amount_dict.copy()) + for stock_id in list(target_amount_dict.keys()): + if trade_exchange.is_stock_tradable(stock_id, trade_date): + del target_amount_dict[stock_id] + else: + # consider cost rate + current_tradable_value /= 1 + max(trade_exchange.close_cost, trade_exchange.open_cost) + + # strategy 1 : generate amount_position by weight_position + # Use API in Exchange() + target_amount_dict = trade_exchange.generate_amount_position_from_weight_position( + weight_position=target_weight_position, + cash=current_tradable_value, + trade_date=trade_date, + ) + order_list = trade_exchange.generate_order_for_target_amount_position( + target_position=target_amount_dict, + current_position=current_amount_dict, + trade_date=trade_date, + ) + return order_list + + +class OrderGenWOInteract(OrderGenerator): + """Order Generator Without Interact""" + + def generate_order_list_from_target_weight_position( + self, + current: Position, + trade_exchange: Exchange, + target_weight_position: dict, + risk_degree: float, + pred_date: pd.Timestamp, + trade_date: pd.Timestamp, + ) -> list: + """generate_order_list_from_target_weight_position + + generate order list directly not using the information (e.g. whether can be traded, the accurate trade price) at trade date. + In target weight position, generating order list need to know the price of objective stock in trade date, but we cannot get that + value when do not interact with exchange, so we check the %close price at pred_date or price recorded in current position. + + :param current: + :type current: Position + :param trade_exchange: + :type trade_exchange: Exchange + :param target_weight_position: + :type target_weight_position: dict + :param risk_degree: + :type risk_degree: float + :param pred_date: + :type pred_date: pd.Timestamp + :param trade_date: + :type trade_date: pd.Timestamp + + :rtype: list + """ + risk_total_value = risk_degree * current.calculate_value() + + current_stock = current.get_stock_list() + amount_dict = {} + for stock_id in target_weight_position: + # Current rule will ignore the stock that not hold and cannot be traded at predict date + if trade_exchange.is_stock_tradable(stock_id=stock_id, trade_date=pred_date): + amount_dict[stock_id] = ( + risk_total_value * target_weight_position[stock_id] / trade_exchange.get_close(stock_id, pred_date) + ) + elif stock_id in current_stock: + amount_dict[stock_id] = ( + risk_total_value * target_weight_position[stock_id] / current.get_stock_price(stock_id) + ) + else: + continue + order_list = trade_exchange.generate_order_for_target_amount_position( + target_position=amount_dict, + current_position=current.get_stock_amount_dict(), + trade_date=trade_date, + ) + return order_list diff --git a/qlib/contrib/strategy/strategy.py b/qlib/contrib/strategy/strategy.py new file mode 100644 index 000000000..a43aa61cf --- /dev/null +++ b/qlib/contrib/strategy/strategy.py @@ -0,0 +1,318 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import copy +import numpy as np +import pandas as pd + +from ..backtest.order import Order +from ...utils import get_pre_trading_date +from .order_generator import OrderGenWInteract + + +class BaseStrategy: + def __init__(self): + pass + + def get_risk_degree(self, date): + """get_risk_degree + Return the proportion of your total value you will used in investment. + Dynamically risk_degree will result in Market timing + """ + # It will use 95% amount of your total value by default + return 0.95 + + def generate_order_list(self, score_series, current, trade_exchange, pred_date, trade_date): + """Parameter + score_series : pd.Seires + stock_id , score + current : Position() + current state of position + DO NOT directly change the state of current + trade_exchange : Exchange() + trade exchange + pred_date : pd.Timestamp + predict date + trade_date : pd.Timestamp + trade date + + DO NOT directly change the state of current + """ + pass + + def update(self, score_series, pred_date, trade_date): + """User can use this method to update strategy state each trade date. + Parameter + --------- + score_series : pd.Series + stock_id , score + pred_date : pd.Timestamp + oredict date + trade_date : pd.Timestamp + trade date + """ + pass + + def init(self, **kwargs): + """Some strategy need to be initial after been implemented, + User can use this method to init his strategy with parameters needed. + """ + pass + + def get_init_args_from_model(self, model, init_date): + """ + This method only be used in 'online' module, it will generate the *args to initial the strategy. + :param + mode : model used in 'online' module + """ + return {} + + +class StrategyWrapper: + """ + StrategyWrapper is a wrapper of another strategy. + By overriding some methods to make some changes on the basic strategy + Cost control and risk control will base on this class. + """ + + def __init__(self, inner_strategy): + """__init__ + + :param inner_strategy: set the inner strategy + """ + self.inner_strategy = inner_strategy + + def __getattr__(self, name): + """__getattr__ + + :param name: If no implementation in this method. Call the method in the innter_strategy by default. + """ + return getattr(self.inner_strategy, name) + + +class AdjustTimer: + """AdjustTimer + Responsible for timing of position adjusting + + This is designed as multiple inheritance mechanism due to + - the is_adjust may need access to the internel state of a strategyw + - it can be reguard as a enhancement to the existing strategy + """ + + # adjust position in each trade date + def is_adjust(self, trade_date): + """is_adjust + Return if the strategy can adjust positions on `trade_date` + Will normally be used in strategy do trading with trade frequency + """ + return True + + +class ListAdjustTimer(AdjustTimer): + def __init__(self, adjust_dates=None): + """__init__ + + :param adjust_dates: an iterable object, it will return a timelist for trading dates + """ + if adjust_dates is None: + # None indicates that all dates is OK for adjusting + self.adjust_dates = None + else: + self.adjust_dates = {pd.Timestamp(dt) for dt in adjust_dates} + + def is_adjust(self, trade_date): + if self.adjust_dates is None: + return True + return pd.Timestamp(trade_date) in self.adjust_dates + + +class WeightStrategyBase(BaseStrategy, AdjustTimer): + def __init__(self, order_generator_cls_or_obj=OrderGenWInteract, *args, **kwargs): + super().__init__(*args, **kwargs) + if isinstance(order_generator_cls_or_obj, type): + self.order_generator = order_generator_cls_or_obj() + else: + self.order_generator = order_generator_cls_or_obj + + def generate_target_weight_position(self, score, current, trade_date): + """Parameter: + score : pred score for this trade date, pd.Series, index is stock_id, contain 'score' column + current : current position, use Position() class + trade_exchange : Exchange() + trade_date : trade date + generate target position from score for this date and the current position + The cash is not considered in the position + """ + raise NotImplementedError() + + def generate_order_list(self, score_series, current, trade_exchange, pred_date, trade_date): + """Parameter + score_series : pd.Seires + stock_id , score + current : Position() + current of account + trade_exchange : Exchange() + exchange + trade_date : pd.Timestamp + date + """ + # judge if to adjust + if not self.is_adjust(trade_date): + return [] + # generate_order_list + # generate_target_weight_position() and generate_order_list_from_target_weight_position() to generate order_list + current_temp = copy.deepcopy(current) + target_weight_position = self.generate_target_weight_position( + score=score_series, current=current_temp, trade_date=trade_date + ) + + order_list = self.order_generator.generate_order_list_from_target_weight_position( + current=current_temp, + trade_exchange=trade_exchange, + risk_degree=self.get_risk_degree(trade_date), + target_weight_position=target_weight_position, + pred_date=pred_date, + trade_date=trade_date, + ) + return order_list + + +class TopkDropoutStrategy(BaseStrategy, ListAdjustTimer): + def __init__(self, topk, n_drop, method="bottom", risk_degree=0.95, thresh=1, hold_thresh=1, **kwargs): + """Parameter + topk : int + The number of stocks in the portfolio + n_drop : int + number of stocks to be replaced in each trading date + method : str + dropout method, random/bottom + risk_degree : float + position percentage of total value + thresh : int + minimun holding days since last buy singal of the stock + hold_thresh : int + minimum holding days + before sell stock , will check current.get_stock_count(order.stock_id) >= self.thresh + """ + super(TopkDropoutStrategy, self).__init__() + ListAdjustTimer.__init__(self, kwargs.get("adjust_dates", None)) + self.topk = topk + self.n_drop = n_drop + self.method = method + self.risk_degree = risk_degree + self.thresh = thresh + # self.stock_count['code'] will be the days the stock has been hold + # since last buy signal. This is designed for thresh + self.stock_count = {} + + self.hold_thresh = hold_thresh + + def get_risk_degree(self, date): + """get_risk_degree + Return the proportion of your total value you will used in investment. + Dynamically risk_degree will result in Market timing + """ + # It will use 95% amoutn of your total value by default + return self.risk_degree + + def generate_order_list(self, score_series, current, trade_exchange, pred_date, trade_date): + """Gnererate order list according to score_series at trade_date. + will not change current. + Parameter + score_series : pd.Seires + stock_id , score + current : Position() + current of account + trade_exchange : Exchange() + exchange + pred_date : pd.Timestamp + predict date + trade_date : pd.Timestamp + trade date + """ + if not self.is_adjust(trade_date): + return [] + current_temp = copy.deepcopy(current) + # generate order list for this adjust date + sell_order_list = [] + buy_order_list = [] + # load score + cash = current_temp.get_cash() + current_stock_list = current_temp.get_stock_list() + last = score_series.reindex(current_stock_list).sort_values(ascending=False).index + today = ( + score_series[~score_series.index.isin(last)] + .sort_values(ascending=False) + .index[: self.n_drop + self.topk - len(last)] + ) + comb = score_series.reindex(last.union(today)).sort_values(ascending=False).index + if self.method == "bottom": + sell = last[last.isin(comb[-self.n_drop :])] + elif self.method == "random": + sell = pd.Index(np.random.choice(last, self.n_drop) if len(last) else []) + buy = today[: len(sell) + self.topk - len(last)] + for code in current_stock_list: + if not trade_exchange.is_stock_tradable(stock_id=code, trade_date=trade_date): + continue + if code in sell: + # check hold limit + if self.stock_count[code] < self.thresh or current_temp.get_stock_count(code) < self.hold_thresh: + # can not sell this code + # no buy signal, but the stock is kept + self.stock_count[code] += 1 + continue + # sell order + sell_amount = current_temp.get_stock_amount(code=code) + sell_order = Order( + stock_id=code, + amount=sell_amount, + trade_date=trade_date, + direction=Order.SELL, # 0 for sell, 1 for buy + factor=trade_exchange.get_factor(code, trade_date), + ) + # is order executable + if trade_exchange.check_order(sell_order): + sell_order_list.append(sell_order) + trade_val, trade_cost, trade_price = trade_exchange.deal_order(sell_order, position=current_temp) + # update cash + cash += trade_val - trade_cost + # sold + del self.stock_count[code] + else: + # no buy signal, but the stock is kept + self.stock_count[code] += 1 + elif code in buy: + # NOTE: This is different from the original version + # get new buy signal + # Only the stock fall in to topk will produce buy signal + self.stock_count[code] = 1 + else: + self.stock_count[code] += 1 + # buy new stock + # note the current has been changed + current_stock_list = current_temp.get_stock_list() + value = cash * self.risk_degree / len(buy) if len(buy) > 0 else 0 + + # open_cost should be considered in the real trading environment, while the backtest in evaluate.py does not consider it + # as the aim of demo is to accomplish same strategy as evaluate.py, so comment out this line + # value = value / (1+trade_exchange.open_cost) # set open_cost limit + for code in buy: + # check is stock supended + if not trade_exchange.is_stock_tradable(stock_id=code, trade_date=trade_date): + continue + # buy order + buy_price = trade_exchange.get_deal_price(stock_id=code, trade_date=trade_date) + buy_amount = value / buy_price + factor = trade_exchange.quote[(code, trade_date)]["$factor"] + buy_amount = trade_exchange.round_amount_by_trade_unit(buy_amount, factor) + buy_order = Order( + stock_id=code, + amount=buy_amount, + trade_date=trade_date, + direction=Order.BUY, # 1 for buy + factor=factor, + ) + buy_order_list.append(buy_order) + self.stock_count[code] = 1 + return sell_order_list + buy_order_list diff --git a/qlib/contrib/tuner/__init__.py b/qlib/contrib/tuner/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/qlib/contrib/tuner/config.py b/qlib/contrib/tuner/config.py new file mode 100644 index 000000000..28796bcf2 --- /dev/null +++ b/qlib/contrib/tuner/config.py @@ -0,0 +1,88 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import yaml +import copy +import os + + +class TunerConfigManager(object): + def __init__(self, config_path): + + if not config_path: + raise ValueError("Config path is invalid.") + self.config_path = config_path + + with open(config_path) as fp: + config = yaml.load(fp) + self.config = copy.deepcopy(config) + + self.pipeline_ex_config = PipelineExperimentConfig(config.get("experiment", dict()), self) + self.pipeline_config = config.get("tuner_pipeline", list()) + self.optim_config = OptimizationConfig(config.get("optimization_criteria", dict()), self) + + self.time_config = config.get("time_period", dict()) + self.data_config = config.get("data", dict()) + self.backtest_config = config.get("backtest", dict()) + self.qlib_client_config = config.get("qlib_client", dict()) + + +class PipelineExperimentConfig(object): + def __init__(self, config, TUNER_CONFIG_MANAGER): + """ + :param config: The config dict for tuner experiment + :param TUNER_CONFIG_MANAGER: The tuner config manager + """ + self.name = config.get("name", "tuner_experiment") + # The dir of the config + self.global_dir = config.get("dir", os.path.dirname(TUNER_CONFIG_MANAGER.config_path)) + # The dir of the result of tuner experiment + self.tuner_ex_dir = config.get("tuner_ex_dir", os.path.join(self.global_dir, self.name)) + if not os.path.exists(self.tuner_ex_dir): + os.makedirs(self.tuner_ex_dir) + # The dir of the results of all estimator experiments + self.estimator_ex_dir = config.get("estimator_ex_dir", os.path.join(self.tuner_ex_dir, "estimator_experiment")) + if not os.path.exists(self.estimator_ex_dir): + os.makedirs(self.estimator_ex_dir) + # Get the tuner type + self.tuner_module_path = config.get("tuner_module_path", "qlib.contrib.tuner.tuner") + self.tuner_class = config.get("tuner_class", "QLibTuner") + # Save the tuner experiment for further view + tuner_ex_config_path = os.path.join(self.tuner_ex_dir, "tuner_config.yaml") + with open(tuner_ex_config_path, "w") as fp: + yaml.dump(TUNER_CONFIG_MANAGER.config, fp) + + +class OptimizationConfig(object): + def __init__(self, config, TUNER_CONFIG_MANAGER): + + self.report_type = config.get("report_type", "pred_long") + if self.report_type not in [ + "pred_long", + "pred_long_short", + "pred_short", + "sub_bench", + "sub_cost", + "model", + ]: + raise ValueError( + "report_type should be one of pred_long, pred_long_short, pred_short, sub_bench, sub_cost and model" + ) + + self.report_factor = config.get("report_factor", "sharpe") + if self.report_factor not in [ + "annual", + "sharpe", + "mdd", + "mean", + "std", + "model_score", + "model_pearsonr", + ]: + raise ValueError( + "report_factor should be one of annual, sharpe, mdd, mean, std, model_pearsonr and model_score" + ) + + self.optim_type = config.get("optim_type", "max") + if self.optim_type not in ["min", "max", "correlation"]: + raise ValueError("optim_type should be min, max or correlation") diff --git a/qlib/contrib/tuner/launcher.py b/qlib/contrib/tuner/launcher.py new file mode 100644 index 000000000..711658c9a --- /dev/null +++ b/qlib/contrib/tuner/launcher.py @@ -0,0 +1,34 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# coding=utf-8 + +import argparse +import importlib +import os +import yaml + +from .config import TunerConfigManager + + +args_parser = argparse.ArgumentParser(prog="tuner") +args_parser.add_argument( + "-c", + "--config_path", + required=True, + type=str, + help="config path indicates where to load yaml config.", +) + +args = args_parser.parse_args() + +TUNER_CONFIG_MANAGER = TunerConfigManager(args.config_path) + + +def run(): + # 1. Get pipeline class. + tuner_pipeline_class = getattr(importlib.import_module(".pipeline", package="qlib.contrib.tuner"), "Pipeline") + # 2. Init tuner pipeline. + tuner_pipeline = tuner_pipeline_class(TUNER_CONFIG_MANAGER) + # 3. Begin to tune + tuner_pipeline.run() diff --git a/qlib/contrib/tuner/pipeline.py b/qlib/contrib/tuner/pipeline.py new file mode 100644 index 000000000..3a76d071d --- /dev/null +++ b/qlib/contrib/tuner/pipeline.py @@ -0,0 +1,86 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import json +import logging +import importlib +from abc import abstractmethod + +from ...log import get_module_logger, TimeInspector +from ...utils import get_module_by_module_path + + +class Pipeline(object): + + GLOBAL_BEST_PARAMS_NAME = "global_best_params.json" + + def __init__(self, tuner_config_manager): + + self.logger = get_module_logger("Pipeline", sh_level=logging.INFO) + + self.tuner_config_manager = tuner_config_manager + + self.pipeline_ex_config = tuner_config_manager.pipeline_ex_config + self.optim_config = tuner_config_manager.optim_config + self.time_config = tuner_config_manager.time_config + self.pipeline_config = tuner_config_manager.pipeline_config + self.data_config = tuner_config_manager.data_config + self.backtest_config = tuner_config_manager.backtest_config + self.qlib_client_config = tuner_config_manager.qlib_client_config + + self.global_best_res = None + self.global_best_params = None + self.best_tuner_index = None + + def run(self): + + TimeInspector.set_time_mark() + for tuner_index, tuner_config in enumerate(self.pipeline_config): + tuner = self.init_tuner(tuner_index, tuner_config) + tuner.tune() + if self.global_best_res is None or self.global_best_res > tuner.best_res: + self.global_best_res = tuner.best_res + self.global_best_params = tuner.best_params + self.best_tuner_index = tuner_index + TimeInspector.log_cost_time("Finished tuner pipeline.") + + self.save_tuner_exp_info() + + def init_tuner(self, tuner_index, tuner_config): + """ + Implement this method to build the tuner by config + return: tuner + """ + # 1. Add experiment config in tuner_config + tuner_config["experiment"] = { + "name": "estimator_experiment_{}".format(tuner_index), + "id": tuner_index, + "dir": self.pipeline_ex_config.estimator_ex_dir, + "observer_type": "file_storage", + } + tuner_config["qlib_client"] = self.qlib_client_config + # 2. Add data config in tuner_config + tuner_config["data"] = self.data_config + # 3. Add backtest config in tuner_config + tuner_config["backtest"] = self.backtest_config + # 4. Update trainer in tuner_config + tuner_config["trainer"].update({"args": self.time_config}) + + # 5. Import Tuner class + tuner_module = get_module_by_module_path(self.pipeline_ex_config.tuner_module_path) + tuner_class = getattr(tuner_module, self.pipeline_ex_config.tuner_class) + # 6. Return the specific tuner + return tuner_class(tuner_config, self.optim_config) + + def save_tuner_exp_info(self): + + TimeInspector.set_time_mark() + save_path = os.path.join(self.pipeline_ex_config.tuner_ex_dir, Pipeline.GLOBAL_BEST_PARAMS_NAME) + with open(save_path, "w") as fp: + json.dump(self.global_best_params, fp) + TimeInspector.log_cost_time("Finished save global best tuner parameters.") + + self.logger.info("Best Tuner id: {}.".format(self.best_tuner_index)) + self.logger.info("Global best parameters: {}.".format(self.global_best_params)) + self.logger.info("You can check the best parameters at {}.".format(save_path)) diff --git a/qlib/contrib/tuner/space.py b/qlib/contrib/tuner/space.py new file mode 100644 index 000000000..76f101671 --- /dev/null +++ b/qlib/contrib/tuner/space.py @@ -0,0 +1,17 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from hyperopt import hp + + +TopkAmountStrategySpace = { + "topk": hp.choice("topk", [30, 35, 40]), + "buffer_margin": hp.choice("buffer_margin", [200, 250, 300]), +} + +QLibDataLabelSpace = { + "labels": hp.choice( + "labels", + [["Ref($vwap, -2)/Ref($vwap, -1) - 1"], ["Ref($close, -5)/$close - 1"]], + ) +} diff --git a/qlib/contrib/tuner/tuner.py b/qlib/contrib/tuner/tuner.py new file mode 100644 index 000000000..8da40bc69 --- /dev/null +++ b/qlib/contrib/tuner/tuner.py @@ -0,0 +1,218 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import yaml +import json +import copy +import pickle +import logging +import importlib +import subprocess +import pandas as pd +import numpy as np + +from abc import abstractmethod + +from ...log import get_module_logger, TimeInspector +from hyperopt import fmin, tpe +from hyperopt import STATUS_OK, STATUS_FAIL + + +class Tuner(object): + def __init__(self, tuner_config, optim_config): + + self.logger = get_module_logger("Tuner", sh_level=logging.INFO) + + self.tuner_config = tuner_config + self.optim_config = optim_config + + self.max_evals = self.tuner_config.get("max_evals", 10) + self.ex_dir = os.path.join( + self.tuner_config["experiment"]["dir"], + self.tuner_config["experiment"]["name"], + ) + + self.best_params = None + self.best_res = None + + self.space = self.setup_space() + + def tune(self): + + TimeInspector.set_time_mark() + fmin( + fn=self.objective, + space=self.space, + algo=tpe.suggest, + max_evals=self.max_evals, + ) + self.logger.info("Local best params: {} ".format(self.best_params)) + TimeInspector.log_cost_time( + "Finished searching best parameters in Tuner {}.".format(self.tuner_config["experiment"]["id"]) + ) + + self.save_local_best_params() + + @abstractmethod + def objective(self, params): + """ + Implement this method to give an optimization factor using parameters in space. + :return: {'loss': a factor for optimization, float type, + 'status': the status of this evaluation step, STATUS_OK or STATUS_FAIL}. + """ + pass + + @abstractmethod + def setup_space(self): + """ + Implement this method to setup the searching space of tuner. + :return: searching space, dict type. + """ + pass + + @abstractmethod + def save_local_best_params(self): + """ + Implement this method to save the best parameters of this tuner. + """ + pass + + +class QLibTuner(Tuner): + + ESTIMATOR_CONFIG_NAME = "estimator_config.yaml" + EXP_INFO_NAME = "exp_info.json" + EXP_RESULT_DIR = "sacred/{}" + EXP_RESULT_NAME = "analysis.pkl" + LOCAL_BEST_PARAMS_NAME = "local_best_params.json" + + def objective(self, params): + + # 1. Setup an config for a spcific estimator process + estimator_path = self.setup_estimator_config(params) + self.logger.info("Searching params: {} ".format(params)) + + # 2. Use subprocess to do the estimator program, this process will wait until subprocess finish + sub_fails = subprocess.call("estimator -c {}".format(estimator_path), shell=True) + if sub_fails: + # If this subprocess failed, ignore this evaluation step + self.logger.info("Estimator experiment failed when using this searching parameters") + return {"loss": np.nan, "status": STATUS_FAIL} + + # 3. Fetch the result of subprocess, and check whether the result is Nan + res = self.fetch_result() + if np.isnan(res): + status = STATUS_FAIL + else: + status = STATUS_OK + + # 4. Save the best score and params + if self.best_res is None or self.best_res > res: + self.best_res = res + self.best_params = params + + # 5. Return the result as optim objective + return {"loss": res, "status": status} + + def fetch_result(self): + + # 1. Get experiment information + exp_info_path = os.path.join(self.ex_dir, QLibTuner.EXP_INFO_NAME) + with open(exp_info_path) as fp: + exp_info = json.load(fp) + estimator_ex_id = exp_info["id"] + + # 2. Return model result if needed + if self.optim_config.report_type == "model": + if self.optim_config.report_factor == "model_score": + # if estimator experiment is multi-label training, user need to process the scores by himself + # Default method is return the average score + return np.mean(exp_info["performance"]["model_score"]) + elif self.optim_config.report_factor == "model_pearsonr": + # pearsonr is a correlation coefficient, 1 is the best + return np.abs(exp_info["performance"]["model_pearsonr"] - 1) + + # 3. Get backtest results + exp_result_dir = os.path.join(self.ex_dir, QLibTuner.EXP_RESULT_DIR.format(estimator_ex_id)) + exp_result_path = os.path.join(exp_result_dir, QLibTuner.EXP_RESULT_NAME) + with open(exp_result_path, "rb") as fp: + analysis_df = pickle.load(fp) + + # 4. Get the backtest factor which user want to optimize, if user want to maximize the factor, then reverse the result + res = analysis_df.loc[self.optim_config.report_type].loc[self.optim_config.report_factor] + # res = res.values[0] if self.optim_config.optim_type == 'min' else -res.values[0] + if self.optim_config == "min": + return res.values[0] + elif self.optim_config == "max": + return -res.values[0] + else: + # self.optim_config == 'correlation' + return np.abs(res.values[0] - 1) + + def setup_estimator_config(self, params): + + estimator_config = copy.deepcopy(self.tuner_config) + estimator_config["model"].update({"args": params["model_space"]}) + estimator_config["strategy"].update({"args": params["strategy_space"]}) + if params.get("data_label_space", None) is not None: + estimator_config["data"]["args"].update(params["data_label_space"]) + + estimator_path = os.path.join( + self.tuner_config["experiment"].get("dir", "../"), + QLibTuner.ESTIMATOR_CONFIG_NAME, + ) + + with open(estimator_path, "w") as fp: + yaml.dump(estimator_config, fp) + + return estimator_path + + def setup_space(self): + # 1. Setup model space + model_space_name = self.tuner_config["model"].get("space", None) + if model_space_name is None: + raise ValueError("Please give the search space of model.") + model_space = getattr( + importlib.import_module(".space", package="qlib.contrib.tuner"), + model_space_name, + ) + + # 2. Setup strategy space + strategy_space_name = self.tuner_config["strategy"].get("space", None) + if strategy_space_name is None: + raise ValueError("Please give the search space of strategy.") + strategy_space = getattr( + importlib.import_module(".space", package="qlib.contrib.tuner"), + strategy_space_name, + ) + + # 3. Setup data label space if given + if self.tuner_config.get("data_label", None) is not None: + data_label_space_name = self.tuner_config["data_label"].get("space", None) + if data_label_space_name is not None: + data_label_space = getattr( + importlib.import_module(".space", package="qlib.contrib.tuner"), + data_label_space_name, + ) + else: + data_label_space_name = None + + # 4. Combine the searching space + space = dict() + space.update({"model_space": model_space}) + space.update({"strategy_space": strategy_space}) + if data_label_space_name is not None: + space.update({"data_label_space": data_label_space}) + + return space + + def save_local_best_params(self): + + TimeInspector.set_time_mark() + local_best_params_path = os.path.join(self.ex_dir, QLibTuner.LOCAL_BEST_PARAMS_NAME) + with open(local_best_params_path, "w") as fp: + json.dump(self.best_params, fp) + TimeInspector.log_cost_time( + "Finished saving local best tuner parameters to: {} .".format(local_best_params_path) + ) diff --git a/qlib/data/__init__.py b/qlib/data/__init__.py new file mode 100644 index 000000000..b6eb66468 --- /dev/null +++ b/qlib/data/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +from .data import ( + D, + CalendarProvider, + InstrumentProvider, + FeatureProvider, + ExpressionProvider, + DatasetProvider, + LocalCalendarProvider, + LocalInstrumentProvider, + LocalFeatureProvider, + LocalExpressionProvider, + LocalDatasetProvider, + ClientCalendarProvider, + ClientInstrumentProvider, + ClientDatasetProvider, + BaseProvider, + LocalProvider, + ClientProvider, +) + +from .cache import ( + ExpressionCache, + DatasetCache, + ServerExpressionCache, + ServerDatasetCache, + SimpleDatasetCache, + ClientDatasetCache, + ClientCalendarCache, +) diff --git a/qlib/data/_libs/__init__.py b/qlib/data/_libs/__init__.py new file mode 100644 index 000000000..59e481eb9 --- /dev/null +++ b/qlib/data/_libs/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. diff --git a/qlib/data/_libs/expanding.pyx b/qlib/data/_libs/expanding.pyx new file mode 100644 index 000000000..76b824c94 --- /dev/null +++ b/qlib/data/_libs/expanding.pyx @@ -0,0 +1,152 @@ +# cython: profile=False +# cython: boundscheck=False, wraparound=False, cdivision=True +cimport cython +cimport numpy as np +import numpy as np + +from libc.math cimport sqrt, isnan, NAN +from libcpp.vector cimport vector + + +cdef class Expanding(object): + """1-D array expanding""" + cdef vector[double] barv + cdef int na_count + def __init__(self): + self.na_count = 0 + + cdef double update(self, double val): + pass + + +cdef class Mean(Expanding): + """1-D array expanding mean""" + cdef double vsum + def __init__(self): + super(Mean, self).__init__() + self.vsum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + if isnan(val): + self.na_count += 1 + else: + self.vsum += val + return self.vsum / (self.barv.size() - self.na_count) + + +cdef class Slope(Expanding): + """1-D array expanding slope""" + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double xy_sum + def __init__(self): + super(Slope, self).__init__() + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + cdef size_t size = self.barv.size() + if isnan(val): + self.na_count += 1 + else: + self.x_sum += size + self.x2_sum += size * size + self.y_sum += val + self.xy_sum += size * val + cdef int N = size - self.na_count + return (N*self.xy_sum - self.x_sum*self.y_sum) / \ + (N*self.x2_sum - self.x_sum*self.x_sum) + + +cdef class Resi(Expanding): + """1-D array expanding residuals""" + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double xy_sum + def __init__(self): + super(Resi, self).__init__() + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + cdef size_t size = self.barv.size() + if isnan(val): + self.na_count += 1 + else: + self.x_sum += size + self.x2_sum += size * size + self.y_sum += val + self.xy_sum += size * val + cdef int N = size - self.na_count + slope = (N*self.xy_sum - self.x_sum*self.y_sum) / \ + (N*self.x2_sum - self.x_sum*self.x_sum) + x_mean = self.x_sum / N + y_mean = self.y_sum / N + interp = y_mean - slope*x_mean + return val - (slope*size + interp) + + +cdef class Rsquare(Expanding): + """1-D array expanding rsquare""" + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double y2_sum + cdef double xy_sum + def __init__(self): + super(Rsquare, self).__init__() + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.y2_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + cdef size_t size = self.barv.size() + if isnan(val): + self.na_count += 1 + else: + self.x_sum += size + self.x2_sum += size + self.y_sum += val + self.y2_sum += val * val + self.xy_sum += size * val + cdef int N = size - self.na_count + cdef double rvalue = (N*self.xy_sum - self.x_sum*self.y_sum) / \ + sqrt((N*self.x2_sum - self.x_sum*self.x_sum) * (N*self.y2_sum - self.y_sum*self.y_sum)) + return rvalue * rvalue + + +cdef np.ndarray[double, ndim=1] expanding(Expanding r, np.ndarray a): + cdef int i + cdef int N = len(a) + cdef np.ndarray[double, ndim=1] ret = np.empty(N) + for i in range(N): + ret[i] = r.update(a[i]) + return ret + +def expanding_mean(np.ndarray a): + cdef Mean r = Mean() + return expanding(r, a) + +def expanding_slope(np.ndarray a): + cdef Slope r = Slope() + return expanding(r, a) + +def expanding_rsquare(np.ndarray a): + cdef Rsquare r = Rsquare() + return expanding(r, a) + +def expanding_resi(np.ndarray a): + cdef Resi r = Resi() + return expanding(r, a) diff --git a/qlib/data/_libs/rolling.pyx b/qlib/data/_libs/rolling.pyx new file mode 100644 index 000000000..37d27ffa4 --- /dev/null +++ b/qlib/data/_libs/rolling.pyx @@ -0,0 +1,207 @@ +# cython: profile=False +# cython: boundscheck=False, wraparound=False, cdivision=True +cimport cython +cimport numpy as np +import numpy as np + +from libc.math cimport sqrt, isnan, NAN +from libcpp.deque cimport deque + + +cdef class Rolling(object): + """1-D array rolling""" + cdef int window + cdef deque[double] barv + cdef int na_count + def __init__(self, int window): + self.window = window + self.na_count = window + cdef int i + for i in range(window): + self.barv.push_back(NAN) + + cdef double update(self, double val): + pass + + +cdef class Mean(Rolling): + """1-D array rolling mean""" + cdef double vsum + def __init__(self, int window): + super(Mean, self).__init__(window) + self.vsum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + if not isnan(self.barv.front()): + self.vsum -= self.barv.front() + else: + self.na_count -= 1 + self.barv.pop_front() + if isnan(val): + self.na_count += 1 + # return NAN + else: + self.vsum += val + return self.vsum / (self.window - self.na_count) + + +cdef class Slope(Rolling): + """1-D array rolling slope""" + cdef double i_sum # can be used as i2_sum + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double xy_sum + def __init__(self, int window): + super(Slope, self).__init__(window) + self.i_sum = 0 + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + self.xy_sum = self.xy_sum - self.y_sum + self.x2_sum = self.x2_sum + self.i_sum - 2*self.x_sum + self.x_sum = self.x_sum - self.i_sum + cdef double _val + _val = self.barv.front() + if not isnan(_val): + self.i_sum -= 1 + self.y_sum -= _val + else: + self.na_count -= 1 + self.barv.pop_front() + if isnan(val): + self.na_count += 1 + # return NAN + else: + self.i_sum += 1 + self.x_sum += self.window + self.x2_sum += self.window * self.window + self.y_sum += val + self.xy_sum += self.window * val + cdef int N = self.window - self.na_count + return (N*self.xy_sum - self.x_sum*self.y_sum) / \ + (N*self.x2_sum - self.x_sum*self.x_sum) + + +cdef class Resi(Rolling): + """1-D array rolling residuals""" + cdef double i_sum # can be used as i2_sum + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double xy_sum + def __init__(self, int window): + super(Resi, self).__init__(window) + self.i_sum = 0 + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + self.xy_sum = self.xy_sum - self.y_sum + self.x2_sum = self.x2_sum + self.i_sum - 2*self.x_sum + self.x_sum = self.x_sum - self.i_sum + cdef double _val + _val = self.barv.front() + if not isnan(_val): + self.i_sum -= 1 + self.y_sum -= _val + else: + self.na_count -= 1 + self.barv.pop_front() + if isnan(val): + self.na_count += 1 + # return NAN + else: + self.i_sum += 1 + self.x_sum += self.window + self.x2_sum += self.window * self.window + self.y_sum += val + self.xy_sum += self.window * val + cdef int N = self.window - self.na_count + slope = (N*self.xy_sum - self.x_sum*self.y_sum) / \ + (N*self.x2_sum - self.x_sum*self.x_sum) + x_mean = self.x_sum / N + y_mean = self.y_sum / N + interp = y_mean - slope*x_mean + return val - (slope*self.window + interp) + + +cdef class Rsquare(Rolling): + """1-D array rolling rsquare""" + cdef double i_sum + cdef double x_sum + cdef double x2_sum + cdef double y_sum + cdef double y2_sum + cdef double xy_sum + def __init__(self, int window): + super(Rsquare, self).__init__(window) + self.i_sum = 0 + self.x_sum = 0 + self.x2_sum = 0 + self.y_sum = 0 + self.y2_sum = 0 + self.xy_sum = 0 + + cdef double update(self, double val): + self.barv.push_back(val) + self.xy_sum = self.xy_sum - self.y_sum + self.x2_sum = self.x2_sum + self.i_sum - 2*self.x_sum + self.x_sum = self.x_sum - self.i_sum + cdef double _val + _val = self.barv.front() + if not isnan(_val): + self.i_sum -= 1 + self.y_sum -= _val + self.y2_sum -= _val * _val + else: + self.na_count -= 1 + self.barv.pop_front() + if isnan(val): + self.na_count += 1 + # return NAN + else: + self.i_sum += 1 + self.x_sum += self.window + self.x2_sum += self.window * self.window + self.y_sum += val + self.y2_sum += val * val + self.xy_sum += self.window * val + cdef int N = self.window - self.na_count + cdef double rvalue + rvalue = (N*self.xy_sum - self.x_sum*self.y_sum) / \ + sqrt((N*self.x2_sum - self.x_sum*self.x_sum) * (N*self.y2_sum - self.y_sum*self.y_sum)) + return rvalue * rvalue + + +cdef np.ndarray[double, ndim=1] rolling(Rolling r, np.ndarray a): + cdef int i + cdef int N = len(a) + cdef np.ndarray[double, ndim=1] ret = np.empty(N) + for i in range(N): + ret[i] = r.update(a[i]) + return ret + +def rolling_mean(np.ndarray a, int window): + cdef Mean r = Mean(window) + return rolling(r, a) + +def rolling_slope(np.ndarray a, int window): + cdef Slope r = Slope(window) + return rolling(r, a) + +def rolling_rsquare(np.ndarray a, int window): + cdef Rsquare r = Rsquare(window) + return rolling(r, a) + +def rolling_resi(np.ndarray a, int window): + cdef Resi r = Resi(window) + return rolling(r, a) diff --git a/qlib/data/base.py b/qlib/data/base.py new file mode 100644 index 000000000..c357700c0 --- /dev/null +++ b/qlib/data/base.py @@ -0,0 +1,229 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import abc +import six +import pandas as pd + + +@six.add_metaclass(abc.ABCMeta) +class Expression(object): + """Expression base class""" + + def __str__(self): + return type(self).__name__ + + def __repr__(self): + return str(self) + + def __gt__(self, other): + from .ops import Gt + + return Gt(self, other) + + def __ge__(self, other): + from .ops import Ge + + return Ge(self, other) + + def __lt__(self, other): + from .ops import Lt + + return Lt(self, other) + + def __le__(self, other): + from .ops import Le + + return Le(self, other) + + def __eq__(self, other): + from .ops import Eq + + return Eq(self, other) + + def __ne__(self, other): + from .ops import Ne + + return Ne(self, other) + + def __add__(self, other): + from .ops import Add + + return Add(self, other) + + def __radd__(self, other): + from .ops import Add + + return Add(other, self) + + def __sub__(self, other): + from .ops import Sub + + return Sub(self, other) + + def __rsub__(self, other): + from .ops import Sub + + return Sub(other, self) + + def __mul__(self, other): + from .ops import Mul + + return Mul(self, other) + + def __rmul__(self, other): + from .ops import Mul + + return Mul(self, other) + + def __div__(self, other): + from .ops import Div + + return Div(self, other) + + def __rdiv__(self, other): + from .ops import Div + + return Div(other, self) + + def __truediv__(self, other): + from .ops import Div + + return Div(self, other) + + def __rtruediv__(self, other): + from .ops import Div + + return Div(other, self) + + def __pow__(self, other): + from .ops import Power + + return Power(self, other) + + def __and__(self, other): + from .ops import And + + return And(self, other) + + def __rand__(self, other): + from .ops import And + + return And(other, self) + + def __or__(self, other): + from .ops import Or + + return Or(self, other) + + def __ror__(self, other): + from .ops import Or + + return Or(other, self) + + def load(self, instrument, start_index, end_index, freq): + """load feature + + Parameters + ---------- + instrument : str + instrument code + start_index : str + feature start index [in calendar] + end_index : str + feature end index [in calendar] + freq : str + feature frequency + + Returns + ---------- + pd.Series + feature series: The index of the series is the calendar index + """ + from .cache import H + + # cache + args = str(self), instrument, start_index, end_index, freq + if args in H["f"]: + return H["f"][args] + if start_index is None or end_index is None or start_index > end_index: + raise ValueError("Invalid index range: {} {}".format(start_index, end_index)) + series = self._load_internal(instrument, start_index, end_index, freq) + series.name = str(self) + H["f"][args] = series + return series + + @abc.abstractmethod + def _load_internal(self, instrument, start_index, end_index, freq): + pass + + @abc.abstractmethod + def get_longest_back_rolling(self): + """Get the longest length of historical data the feature has accessed + + This is designed for getting the needed range of the data to calculate + the features in specific range at first. However, situations like + Ref(Ref($close, -1), 1) can not be handled rightly. + + So this will only used for detecting the length of historical data needed. + """ + # TODO: forward operator like Ref($close, -1) is not supported yet. + raise NotImplementedError("This function must be implemented in your newly defined feature") + + @abc.abstractmethod + def get_extended_window_size(self): + """get_extend_window_size + + For to calculate this Operator in range[start_index, end_index] + We have to get the *leaf feature* in + range[start_index - lft_etd, end_index + rght_etd]. + + Returns + ---------- + (int, int) + lft_etd, rght_etd + """ + raise NotImplementedError("This function must be implemented in your newly defined feature") + + +class Feature(Expression): + """Static Expression + + This kind of feature will load data from provider + """ + + def __init__(self, name=None): + if name: + self._name = name.lower() + else: + self._name = type(self).__name__.lower() + + def __str__(self): + return "$" + self._name + + def _load_internal(self, instrument, start_index, end_index, freq): + # load + from .data import FeatureD + + return FeatureD.feature(instrument, str(self), start_index, end_index, freq) + + def get_longest_back_rolling(self): + return 0 + + def get_extended_window_size(self): + return 0, 0 + + +@six.add_metaclass(abc.ABCMeta) +class ExpressionOps(Expression): + """Operator Expression + + This kind of feature will use operator for feature + construction on the fly. + """ + + pass diff --git a/qlib/data/cache.py b/qlib/data/cache.py new file mode 100644 index 000000000..33327107d --- /dev/null +++ b/qlib/data/cache.py @@ -0,0 +1,1149 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import os +import sys +import stat +import time +import pickle +import traceback +import redis_lock +import contextlib +from pathlib import Path +import numpy as np +import pandas as pd +from collections import OrderedDict + +from ..config import C +from ..utils import ( + hash_args, + get_redis_connection, + read_bin, + parse_field, + remove_fields_space, + normalize_cache_fields, + normalize_cache_instruments, +) + +from ..log import get_module_logger +from .base import Feature + +from .ops import * + + +class MemCacheUnit(OrderedDict): + """Memory Cache Unit.""" + + # TODO: use min_heap to replace ordereddict for better performance + + def __init__(self, *args, **kwargs): + self.size_limit = kwargs.pop("size_limit", None) + # limit_type: check size_limit type, length(call fun: len) or size(call fun: sys.getsizeof) + self.limit_type = kwargs.pop("limit_type", "length") + super(MemCacheUnit, self).__init__(*args, **kwargs) + self._check_size_limit() + + def __setitem__(self, key, value): + super(MemCacheUnit, self).__setitem__(key, value) + self._check_size_limit() + + def __getitem__(self, key): + value = super(MemCacheUnit, self).__getitem__(key) + super(MemCacheUnit, self).__delitem__(key) + super(MemCacheUnit, self).__setitem__(key, value) + return value + + def _check_size_limit(self): + if self.size_limit is not None: + get_cur_size = lambda x: len(x) if self.limit_type == "length" else sum(map(sys.getsizeof, x.values())) + while get_cur_size(self) > self.size_limit: + self.popitem(last=False) + + +class MemCache(object): + """Memory cache.""" + + def __init__(self, mem_cache_size_limit=None, limit_type="length"): + """ + + Parameters + ---------- + mem_cache_size_limit: cache max size + limit_type: length or sizeof; length(call fun: len), size(call fun: sys.getsizeof) + """ + if limit_type not in ["length", "sizeof"]: + raise ValueError(f"limit_type must be length or sizeof, your limit_type is {limit_type}") + + self.__calendar_mem_cache = MemCacheUnit( + size_limit=C.mem_cache_size_limit if mem_cache_size_limit is None else mem_cache_size_limit, + limit_type=limit_type, + ) + self.__instrument_mem_cache = MemCacheUnit( + size_limit=C.mem_cache_size_limit if mem_cache_size_limit is None else mem_cache_size_limit, + limit_type=limit_type, + ) + self.__feature_mem_cache = MemCacheUnit( + size_limit=C.mem_cache_size_limit if mem_cache_size_limit is None else mem_cache_size_limit, + limit_type=limit_type, + ) + + def __getitem__(self, key): + if key == "c": + return self.__calendar_mem_cache + elif key == "i": + return self.__instrument_mem_cache + elif key == "f": + return self.__feature_mem_cache + else: + raise KeyError("Unknown memcache unit") + + def clear(self): + self.__calendar_mem_cache.clear() + self.__instrument_mem_cache.clear() + self.__feature_mem_cache.clear() + + +class MemCacheExpire: + CACHE_EXPIRE = C.mem_cache_expire + + @staticmethod + def set_cache(mem_cache, key, value): + """set cache + + :param mem_cache: MemCache attribute('c'/'i'/'f') + :param key: cache key + :param value: cache value + """ + mem_cache[key] = value, time.time() + + @staticmethod + def get_cache(mem_cache, key): + """get mem cache + + :param mem_cache: MemCache attribute('c'/'i'/'f') + :param key: cache key + :return: cache value; if cache not exist, return None + """ + value = None + expire = False + if key in mem_cache: + value, latest_time = mem_cache[key] + expire = (time.time() - latest_time) > MemCacheExpire.CACHE_EXPIRE + return value, expire + + +class CacheUtils(object): + LOCK_ID = "QLIB" + + @staticmethod + def organize_meta_file(): + pass + + @staticmethod + def reset_lock(): + r = get_redis_connection() + redis_lock.reset_all(r) + + @staticmethod + def visit(cache_path): + # FIXME: Because read_lock was canceled when reading the cache, multiple processes may have read and write exceptions here + try: + with open(cache_path + ".meta", "rb") as f: + d = pickle.load(f) + with open(cache_path + ".meta", "wb") as f: + try: + d["meta"]["last_visit"] = str(time.time()) + d["meta"]["visits"] = d["meta"]["visits"] + 1 + except KeyError: + raise KeyError("Unknown meta keyword") + pickle.dump(d, f) + except Exception as e: + get_module_logger("CacheUtils").warning(f"visit {cache_path} cache error: {e}") + + @staticmethod + @contextlib.contextmanager + def reader_lock(redis_t, lock_name): + lock_name = f"{C.provider_uri}:{lock_name}" + current_cache_rlock = redis_lock.Lock(redis_t, "%s-rlock" % lock_name) + current_cache_wlock = redis_lock.Lock(redis_t, "%s-wlock" % lock_name) + # make sure only one reader is entering + current_cache_rlock.acquire(timeout=60) + try: + current_cache_readers = redis_t.get("%s-reader" % lock_name) + if current_cache_readers is None or int(current_cache_readers) == 0: + current_cache_wlock.acquire() + redis_t.incr("%s-reader" % lock_name) + finally: + current_cache_rlock.release() + try: + yield + finally: + # make sure only one reader is leaving + current_cache_rlock.acquire(timeout=60) + try: + redis_t.decr("%s-reader" % lock_name) + if int(redis_t.get("%s-reader" % lock_name)) == 0: + redis_t.delete("%s-reader" % lock_name) + current_cache_wlock.reset() + finally: + current_cache_rlock.release() + + @staticmethod + @contextlib.contextmanager + def writer_lock(redis_t, lock_name): + lock_name = f"{C.provider_uri}:{lock_name}" + current_cache_wlock = redis_lock.Lock(redis_t, "%s-wlock" % lock_name, id=CacheUtils.LOCK_ID) + current_cache_wlock.acquire() + try: + yield + finally: + current_cache_wlock.release() + + +class BaseProviderCache(object): + """Provider cache base class""" + + def __init__(self, provider): + self.provider = provider + self.logger = get_module_logger(self.__class__.__name__) + + def __getattr__(self, attr): + return getattr(self.provider, attr) + + +class ExpressionCache(BaseProviderCache): + """Expression cache mechanism base class. + + This class is used to wrap expression provider with self-defined expression cache mechanism. + + .. note:: Override the `_uri` and `_expression` method to create your own expression cache mechanism. + """ + + def expression(self, instrument, field, start_time, end_time, freq): + """Get expression data. + + .. note:: Same interface as `expression` method in expression provider + """ + try: + return self._expression(instrument, field, start_time, end_time, freq) + except NotImplementedError: + return self.provider.expression(instrument, field, start_time, end_time, freq) + + def _uri(self, instrument, field, start_time, end_time, freq): + """Get expression cache file uri. + + Override this method to define how to get expression cache file uri corresponding to users' own cache mechanism. + """ + raise NotImplementedError("Implement this function to match your own cache mechanism") + + def _expression(self, instrument, field, start_time, end_time, freq): + """Get expression data using cache. + + Override this method to define how to get expression data corresponding to users' own cache mechanism. + """ + raise NotImplementedError("Implement this method if you want to use expression cache") + + def update(self, cache_uri): + """Update expression cache to latest calendar. + + Overide this method to define how to update expression cache corresponding to users' own cache mechanism. + + Parameters + ---------- + cache_uri : str + the complete uri of expression cache file (include dir path) + + Returns + ------- + int + 0(successful update)/ 1(no need to update)/ 2(update failure) + """ + raise NotImplementedError("Implement this method if you want to make expression cache up to date") + + +class DatasetCache(BaseProviderCache): + """Dataset cache mechanism base class. + + This class is used to wrap dataset provider with self-defined dataset cache mechanism. + + .. note:: Override the `_uri` and `_dataset` method to create your own dataset cache mechanism. + """ + + HDF_KEY = "df" + + def dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=1, + ): + """Get feature dataset. + + .. note:: Same interface as `dataset` method in dataset provider + + .. note:: The server use redis_lock to make sure + read-write conflicts will not be triggered + but client readers are not considered. + """ + if disk_cache == 0: + # skip cache + return self.provider.dataset(instruments, fields, start_time, end_time, freq) + else: + # use and replace cache + try: + return self._dataset(instruments, fields, start_time, end_time, freq, disk_cache) + except NotImplementedError: + return self.provider.dataset(instruments, fields, start_time, end_time, freq) + + def _uri(self, instruments, fields, start_time, end_time, freq, **kwargs): + """Get dataset cache file uri. + + Override this method to define how to get dataset cache file uri corresponding to users' own cache mechanism. + """ + raise NotImplementedError("Implement this function to match your own cache mechanism") + + def _dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=1, + ): + """Get feature dataset using cache. + + Override this method to define how to get feature dataset corresponding to users' own cache mechanism. + """ + raise NotImplementedError("Implement this method if you want to use dataset feature cache") + + def _dataset_uri( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=1, + ): + """Get a uri of feature dataset using cache. + specially: + disk_cache=1 means using data set cache and return the uri of cache file. + disk_cache=0 means client knows the path of expression cache, + server checks if the cache exists(if not, generate it), and client loads data by itself. + Override this method to define how to get feature dataset uri corresponding to users' own cache mechanism. + """ + raise NotImplementedError( + "Implement this method if you want to use dataset feature cache as a cache file for client" + ) + + def update(self, cache_uri): + """Update dataset cache to latest calendar. + + Overide this method to define how to update dataset cache corresponding to users' own cache mechanism. + + Parameters + ---------- + cache_uri : str + the complete uri of dataset cache file (include dir path) + + Returns + ------- + int + 0(successful update)/ 1(no need to update)/ 2(update failure) + """ + raise NotImplementedError("Implement this method if you want to make expression cache up to date") + + @staticmethod + def cache_to_origin_data(data, fields): + """cache data to origin data + + :param data: pd.DataFrame, cache data + :param fields: feature fields + :return: pd.DataFrame + """ + not_space_fields = remove_fields_space(fields) + data = data.loc[:, not_space_fields] + # set features fields + data.columns = list(fields) + return data + + @staticmethod + def normalize_uri_args(instruments, fields, freq): + """normalize uri args""" + instruments = normalize_cache_instruments(instruments) + fields = normalize_cache_fields(fields) + freq = freq.lower() + + return instruments, fields, freq + + +class ServerExpressionCache(ExpressionCache): + """Prepared cache mechanism for server.""" + + def __init__(self, provider, **kwargs): + super(ServerExpressionCache, self).__init__(provider) + self.r = get_redis_connection() + # remote==True means client is using this module, writing behaviour will not be allowed. + self.remote = kwargs.get("remote", False) + if self.remote: + self.expr_cache_path = os.path.join(C.mount_path, C.features_cache_dir_name) + else: + self.expr_cache_path = os.path.join(C.provider_uri, C.features_cache_dir_name) + os.makedirs(self.expr_cache_path, exist_ok=True) + + def _uri(self, instrument, field, start_time, end_time, freq): + field = remove_fields_space(field) + instrument = str(instrument).lower() + return hash_args(instrument, field, freq) + + @staticmethod + def check_cache_exists(cache_path): + for p in [cache_path, cache_path + ".meta"]: + if not Path(p).exists(): + return False + return True + + def _expression(self, instrument, field, start_time=None, end_time=None, freq="day"): + _cache_uri = self._uri( + instrument=instrument, + field=field, + start_time=None, + end_time=None, + freq=freq, + ) + _instrument_dir = os.path.join(self.expr_cache_path, instrument.lower()) + cache_path = os.path.join(_instrument_dir, _cache_uri) + # get calendar + from .data import Cal + + _calendar = Cal.calendar(freq=freq) + + _, _, start_index, end_index = Cal.locate_index(start_time, end_time, freq, future=False) + + if self.check_cache_exists(cache_path): + """ + In most cases, we do not need reader_lock. + Because updating data is a small probability event compare to reading data. + + """ + # FIXME: Removing the reader lock may result in conflicts. + # with CacheUtils.reader_lock(self.r, 'expression-%s' % _cache_uri): + + # modify expression cache meta file + try: + # FIXME: Multiple readers may result in error visit number + if not self.remote: + CacheUtils.visit(cache_path) + series = read_bin(cache_path, start_index, end_index) + return series + except Exception as e: + series = None + self.logger.error("reading %s file error : %s" % (cache_path, traceback.format_exc())) + return series + else: + # normalize field + field = remove_fields_space(field) + # cache unavailable, generate the cache + if not os.path.exists(_instrument_dir): + os.makedirs(_instrument_dir, exist_ok=True) + if not isinstance(eval(parse_field(field)), Feature): + # When the expression is not a raw feature + # generate expression cache if the feature is not a Feature + # instance + series = self.provider.expression(instrument, field, _calendar[0], _calendar[-1], freq) + if not series.empty: + # This expresion is empty, we don't generate any cache for it. + with CacheUtils.writer_lock(self.r, "expression-%s" % _cache_uri): + self.gen_expression_cache( + expression_data=series, + cache_path=cache_path, + instrument=instrument, + field=field, + freq=freq, + last_update=str(_calendar[-1]), + ) + return series.loc[start_index:end_index] + else: + return series + else: + # If the expression is a raw feature(such as $close, $open) + return self.provider.expression(instrument, field, start_time, end_time, freq) + + @staticmethod + def clear_cache(cache_path): + meta_path = cache_path + ".meta" + for p in [cache_path, meta_path]: + p = Path(p) + if p.exists(): + p.unlink() + + def gen_expression_cache(self, expression_data, cache_path, instrument, field, freq, last_update): + """use bin file to save like feature-data.""" + # Make sure the cache runs right when the directory is deleted + # while running + meta = { + "info": { + "instrument": instrument, + "field": field, + "freq": freq, + "last_update": last_update, + }, + "meta": {"last_visit": time.time(), "visits": 1}, + } + self.logger.debug(f"generating expression cache: {meta}") + os.makedirs(self.expr_cache_path, exist_ok=True) + self.clear_cache(cache_path) + meta_path = cache_path + ".meta" + + with open(meta_path, "wb") as f: + pickle.dump(meta, f) + os.chmod(meta_path, stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) + df = expression_data.to_frame() + + r = np.hstack([df.index[0], expression_data]).astype(" 0: + start, stop = ( + index_data["start"].iloc[0].item(), + index_data["end"].iloc[-1].item(), + ) + else: + start = stop = 0 + + with pd.HDFStore(cache_path, mode="r") as store: + if "/{}".format(im.KEY) in store.keys(): + df = store.select(key=im.KEY, start=start, stop=stop) + df.reset_index(inplace=True) + df.set_index(["instrument", "datetime"], inplace=True) + df.sort_index(inplace=True) + # read cache and need to replace not-space fields to field + df = cls.cache_to_origin_data(df, fields) + + else: + df = pd.DataFrame(columns=fields) + return df + + def _dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=0, + ): + + if disk_cache == 0: + # In this case, data_set cache is configured but will not be used. + return self.provider.dataset(instruments, fields, start_time, end_time, freq) + + _cache_uri = self._uri( + instruments=instruments, + fields=fields, + start_time=None, + end_time=None, + freq=freq, + disk_cache=disk_cache, + ) + + cache_path = os.path.join(self.dtst_cache_path, _cache_uri) + + features = pd.DataFrame() + gen_flag = False + + if self.check_cache_exists(cache_path): + if disk_cache == 1: + # use cache + with CacheUtils.reader_lock(self.r, "dataset-%s" % _cache_uri): + CacheUtils.visit(cache_path) + features = self.read_data_from_cache(cache_path, start_time, end_time, fields) + elif disk_cache == 2: + gen_flag = True + else: + gen_flag = True + + if gen_flag: + # cache unavailable, generate the cache + with CacheUtils.writer_lock(self.r, "dataset-%s" % _cache_uri): + features = self.gen_dataset_cache( + cache_path=cache_path, + instruments=instruments, + fields=fields, + freq=freq, + ) + if not features.empty: + features.reset_index(inplace=True) + features.set_index(["datetime", "instrument"], inplace=True) + features.sort_index(inplace=True) + features = features.loc[start_time:end_time] + return features + + def _dataset_uri( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=0, + ): + if disk_cache == 0: + # In this case, server only checks the expression cache. + # The client will load the cache data by itself. + from .data import LocalDatasetProvider + + LocalDatasetProvider.multi_cache_walker(instruments, fields, start_time, end_time, freq) + return "" + + _cache_uri = self._uri( + instruments=instruments, + fields=fields, + start_time=None, + end_time=None, + freq=freq, + disk_cache=disk_cache, + ) + cache_path = os.path.join(self.dtst_cache_path, _cache_uri) + + if self.check_cache_exists(cache_path): + self.logger.debug(f"The cache dataset has already existed {cache_path}. Return the uri directly") + with CacheUtils.reader_lock(self.r, "dataset-%s" % _cache_uri): + CacheUtils.visit(cache_path) + return _cache_uri + else: + # cache unavailable, generate the cache + with CacheUtils.writer_lock(self.r, "dataset-%s" % _cache_uri): + self.gen_dataset_cache( + cache_path=cache_path, + instruments=instruments, + fields=fields, + freq=freq, + ) + return _cache_uri + + class IndexManager: + """ + The lock is not considered in the class. Please consider the lock outside the code. + This class is the proxy of the disk data. + """ + + KEY = "df" + + def __init__(self, cache_path): + self.index_path = cache_path + ".index" + self._data = None + self.logger = get_module_logger(self.__class__.__name__) + + def get_index(self, start_time=None, end_time=None): + # TODO: fast read index from the disk. + if self._data is None: + self.sync_from_disk() + return self._data.loc[start_time:end_time].copy() + + def sync_to_disk(self): + if self._data is None: + raise ValueError("No data to sync to disk.") + self._data.sort_index(inplace=True) + self._data.to_hdf(self.index_path, key=self.KEY, mode="w", format="table") + # The index should be readable for all users + os.chmod(self.index_path, stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) + + def sync_from_disk(self): + # The file will not be closed directly if we read_hdf from the disk directly + with pd.HDFStore(self.index_path, mode="r") as store: + if "/{}".format(self.KEY) in store.keys(): + self._data = pd.read_hdf(store, key=self.KEY) + else: + self._data = pd.DataFrame() + + def update(self, data, sync=True): + self._data = data.astype(np.int32).copy() + if sync: + self.sync_to_disk() + + def append_index(self, data, to_disk=True): + data = data.astype(np.int32).copy() + data.sort_index(inplace=True) + self._data = pd.concat([self._data, data]) + if to_disk: + with pd.HDFStore(self.index_path) as store: + store.append(self.KEY, data, append=True) + + @staticmethod + def build_index_from_data(data, start_index=0): + if data.empty: + return pd.DataFrame() + line_data = data.iloc[:, 0].fillna(0).groupby("datetime").count() + line_data.sort_index(inplace=True) + index_end = line_data.cumsum() + index_start = index_end.shift(1).fillna(0) + + index_data = pd.DataFrame() + index_data["start"] = index_start + index_data["end"] = index_end + index_data += start_index + return index_data + + @staticmethod + def clear_cache(cache_path): + meta_path = cache_path + ".meta" + for p in [cache_path, meta_path, cache_path + ".index", cache_path + ".data"]: + p = Path(p) + if p.exists(): + p.unlink() + + def gen_dataset_cache(self, cache_path, instruments, fields, freq): + """gen_dataset_cache + + .. note:: This function does not consider the cache read write lock. Please + Aquire the lock outside this function + + The format the cache contains 3 parts(followed by typical filename). + + - index : cache/d41366901e25de3ec47297f12e2ba11d.index + - The content of the file may be in following format(pandas.Series) + + .. code-block:: python + + start end + 1999-11-10 00:00:00 0 1 + 1999-11-11 00:00:00 1 2 + 1999-11-12 00:00:00 2 3 + ... + + .. note:: The start is closed. The end is open!!!!! + + - Each line contains two element + - It indicates the `end_index` of the data for `timestamp` + + - meta data: cache/d41366901e25de3ec47297f12e2ba11d.meta + - data : cache/d41366901e25de3ec47297f12e2ba11d + - This is a hdf file sorted by datetime + + :param cache_path: The path to store the cache + :param instruments: The instruments to store the cache + :param fields: The fields to store the cache + :param freq: The freq to store the cache + + :return type pd.DataFrame; The fields of the returned DataFrame are consistent with the parameters of the function + """ + # get calendar + from .data import Cal + + _calendar = Cal.calendar(freq=freq) + self.logger.debug(f"Generating dataset cache {cache_path}") + # Make sure the cache runs right when the directory is deleted + # while running + os.makedirs(self.dtst_cache_path, exist_ok=True) + self.clear_cache(cache_path) + + features = self.provider.dataset(instruments, fields, _calendar[0], _calendar[-1], freq) + + # sort index by datetime + if not features.empty: + features.reset_index(inplace=True) + features.set_index(["datetime", "instrument"], inplace=True) + features.sort_index(inplace=True) + + # write cache data + with pd.HDFStore(cache_path + ".data") as store: + cache_to_orig_map = dict(zip(remove_fields_space(features.columns), features.columns)) + orig_to_cache_map = dict(zip(features.columns, remove_fields_space(features.columns))) + cache_features = features[list(cache_to_orig_map.values())].rename(columns=orig_to_cache_map) + # cache columns + cache_columns = sorted(cache_features.columns) + cache_features = cache_features.loc[:, cache_columns] + cache_features = cache_features.loc[:, ~cache_features.columns.duplicated()] + store.append(DatasetCache.HDF_KEY, cache_features, append=False) + # write meta file + meta = { + "info": { + "instruments": instruments, + "fields": cache_columns, + "freq": freq, + "last_update": str(_calendar[-1]), # The last_update to store the cache + }, + "meta": {"last_visit": time.time(), "visits": 1}, + } + with open(cache_path + ".meta", "wb") as f: + pickle.dump(meta, f) + os.chmod(cache_path + ".meta", stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) + # write index file + im = ServerDatasetCache.IndexManager(cache_path) + index_data = im.build_index_from_data(features) + im.update(index_data) + + # rename the file after the cache has been generated + # this doesn't work well on windows, but our server won't use windows + # temporarily + os.replace(cache_path + ".data", cache_path) + # the fields of the cached features are converted to the original fields + return features + + def update(self, cache_uri): + cp_cache_uri = os.path.join(self.dtst_cache_path, cache_uri) + + if not self.check_cache_exists(cp_cache_uri): + self.logger.info(f"The cache {cp_cache_uri} has corrupted. It will be removed") + self.clear_cache(cp_cache_uri) + return 2 + + im = ServerDatasetCache.IndexManager(cp_cache_uri) + with CacheUtils.writer_lock(self.r, "dataset-%s" % cache_uri): + with open(cp_cache_uri + ".meta", "rb") as f: + d = pickle.load(f) + instruments = d["info"]["instruments"] + fields = d["info"]["fields"] + freq = d["info"]["freq"] + last_update_time = d["info"]["last_update"] + index_data = im.get_index() + + self.logger.debug("Updating dataset: {}".format(d)) + from .data import Inst + + if Inst.get_inst_type(instruments) == Inst.DICT: + self.logger.info(f"The file {cache_uri} has dict cache. Skip updating") + return 1 + + # get newest calendar + from .data import Cal + + whole_calendar = Cal.calendar(start_time=None, end_time=None, freq=freq) + # The calendar since last updated + new_calendar = Cal.calendar(start_time=last_update_time, end_time=None, freq=freq) + + # get append data + if len(new_calendar) <= 1: + # Including last updated calendar, we only get 1 item. + # No future updating is needed. + return 1 + else: + # get the data needed after the historical data are removed. + # The start index of new data + current_index = len(whole_calendar) - len(new_calendar) + 1 + + # To avoid recursive import + from .data import ExpressionD + + # The existing data length + lft_etd = rght_etd = 0 + for field in fields: + expr = ExpressionD.get_expression_instance(field) + l, r = expr.get_extended_window_size() + lft_etd = max(lft_etd, l) + rght_etd = max(rght_etd, r) + # remove the period that should be updated. + if index_data.empty: + # We don't have any data for such dataset. Nothing to remove + rm_n_period = rm_lines = 0 + else: + rm_n_period = min(rght_etd, index_data.shape[0]) + rm_lines = ( + (index_data["end"] - index_data["start"]) + .loc[whole_calendar[current_index - rm_n_period] :] + .sum() + .item() + ) + + data = self.provider.dataset( + instruments, + fields, + whole_calendar[current_index - rm_n_period], + new_calendar[-1], + freq, + ) + + if not data.empty: + data.reset_index(inplace=True) + data.set_index(["datetime", "instrument"], inplace=True) + data.sort_index(inplace=True) + else: + return 0 # No data to update cache + + store = pd.HDFStore(cp_cache_uri) + # FIXME: + # Because the feature cache are stored as .bin file. + # So the series read from features are all float32. + # However, the first dataset cache is calulated based on the + # raw data. So the data type may be float64. + # Different data type will result in failure of appending data + if "/{}".format(DatasetCache.HDF_KEY) in store.keys(): + schema = store.select(DatasetCache.HDF_KEY, start=0, stop=0) + for col, dtype in schema.dtypes.items(): + data[col] = data[col].astype(dtype) + if rm_lines > 0: + store.remove(key=im.KEY, start=-rm_lines) + store.append(DatasetCache.HDF_KEY, data) + store.close() + + # update index file + new_index_data = im.build_index_from_data( + data.loc(axis=0)[whole_calendar[current_index] :, :], + start_index=0 if index_data.empty else index_data["end"].iloc[-1], + ) + im.append_index(new_index_data) + + # update meta file + d["info"]["last_update"] = str(new_calendar[-1]) + with open(cp_cache_uri + ".meta", "wb") as f: + pickle.dump(d, f) + return 0 + + +class SimpleDatasetCache(DatasetCache): + """Simple dataset cache that can be used locally or on client.""" + + def __init__(self, provider): + super(SimpleDatasetCache, self).__init__(provider) + try: + self.local_cache_path = C["local_cache_path"] + except KeyError as e: + self.logger.error("Assign a local_cache_path in config if you want to use this cache mechanism") + + def _uri(self, instruments, fields, start_time, end_time, freq, disk_cache=1, **kwargs): + instruments, fields, freq = self.normalize_uri_args(instruments, fields, freq) + local_cache_path = str(Path(self.local_cache_path).expanduser().resolve()) + return hash_args( + instruments, + fields, + start_time, + end_time, + freq, + disk_cache, + local_cache_path, + ) + + def _dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=1, + ): + if disk_cache == 0: + # In this case, data_set cache is configured but will not be used. + return self.provider.dataset(instruments, fields, start_time, end_time, freq) + os.makedirs(os.path.expanduser(self.local_cache_path), exist_ok=True) + cache_file = os.path.join( + self.local_cache_path, + self._uri(instruments, fields, start_time, end_time, freq, disk_cache=disk_cache), + ) + gen_flag = False + + if os.path.exists(cache_file): + if disk_cache == 1: + # use cache + df = pd.read_pickle(cache_file) + return self.cache_to_origin_data(df, fields) + elif disk_cache == 2: + # replace cache + gen_flag = True + else: + gen_flag = True + + if gen_flag: + data = self.provider.dataset(instruments, normalize_cache_fields(fields), start_time, end_time, freq) + data.to_pickle(cache_file) + return self.cache_to_origin_data(data, fields) + + +class ClientDatasetCache(DatasetCache): + """Prepared cache mechanism for server.""" + + def __init__(self, provider): + super(ClientDatasetCache, self).__init__(provider) + + def _uri(self, instruments, fields, start_time, end_time, freq, disk_cache=1, **kwargs): + return hash_args(*self.normalize_uri_args(instruments, fields, freq), disk_cache) + + def dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=0, + ): + + if "local" in C.dataset_provider.lower(): + # use LocalDatasetProvider + return self.provider.dataset(instruments, fields, start_time, end_time, freq) + + if disk_cache == 0: + # do not use data_set cache, load data from remote expression cache directly + return self.provider.dataset( + instruments, + fields, + start_time, + end_time, + freq, + disk_cache, + return_uri=False, + ) + + # use ClientDatasetProvider + feature_uri = self._uri(instruments, fields, None, None, freq, disk_cache=disk_cache) + value, expire = MemCacheExpire.get_cache(H["f"], feature_uri) + mnt_feature_uri = os.path.join(C.mount_path, C.dataset_cache_dir_name, feature_uri) + if value is None or expire or not os.path.exists(mnt_feature_uri): + df, uri = self.provider.dataset( + instruments, + fields, + start_time, + end_time, + freq, + disk_cache, + return_uri=True, + ) + # cache uri + MemCacheExpire.set_cache(H["f"], uri, uri) + # cache DataFrame + # HZ['f'][uri] = df.copy() + get_module_logger("cache").debug(f"get feature from {C.dataset_provider}") + else: + mnt_feature_uri = os.path.join(C.mount_path, C.dataset_cache_dir_name, feature_uri) + df = ServerDatasetCache.read_data_from_cache(mnt_feature_uri, start_time, end_time, fields) + get_module_logger("cache").debug("get feature from uri cache") + + return df + + +class CalendarCache(BaseProviderCache): + pass + + +class ClientCalendarCache(CalendarCache): + def calendar(self, start_time=None, end_time=None, freq="day", future=False): + uri = self._uri(start_time, end_time, freq, future) + result, expire = MemCacheExpire.get_cache(H["c"], uri) + if result is None or expire: + + result = self.provider.calendar(start_time, end_time, freq, future) + MemCacheExpire.set_cache(H["c"], uri, result) + + get_module_logger("data").debug(f"get calendar from {C.calendar_provider}") + else: + get_module_logger("data").debug("get calendar from local cache") + + return result + + +# MemCache sizeof +HZ = MemCache(C.mem_cache_space_limit, limit_type="sizeof") +# MemCache length +H = MemCache(limit_type="length") diff --git a/qlib/data/client.py b/qlib/data/client.py new file mode 100644 index 000000000..2e83726d1 --- /dev/null +++ b/qlib/data/client.py @@ -0,0 +1,102 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import socketio + +from .. import __version__ +from ..log import get_module_logger +import pickle + + +class Client(object): + """A client class + + Provide the connection tool functions for ClientProvider. + """ + + def __init__(self, host, port): + super(Client, self).__init__() + self.sio = socketio.Client() + self.server_host = host + self.server_port = port + self.logger = get_module_logger(self.__class__.__name__) + # bind connect/disconnect callbacks + self.sio.on( + "connect", + lambda: self.logger.debug("Connect to server {}".format(self.sio.connection_url)), + ) + self.sio.on("disconnect", lambda: self.logger.debug("Disconnect from server!")) + + def connect_server(self): + """Connect to server.""" + try: + self.sio.connect("ws://" + self.server_host + ":" + str(self.server_port)) + except socketio.exceptions.ConnectionError: + self.logger.error("Cannot connect to server - check your network or server status") + + def disconnect(self): + """Disconnect from server.""" + try: + self.sio.eio.disconnect(True) + except Exception as e: + self.logger.error("Cannot disconnect from server : %s" % e) + + def send_request(self, request_type, request_content, msg_queue, msg_proc_func=None): + """Send a certain request to server. + + Parameters + ---------- + request_type : str + type of proposed request, 'calendar'/'instrument'/'feature' + request_content : dict + records the information of the request + msg_proc_func : func + the function to process the message when receiving response, should have arg `*args` + msg_queue: Queue + The queue to pass the messsage after callback + """ + head_info = {"version": __version__} + + def request_callback(*args): + """callback_wrapper + + :param *args: args[0] is the response content + """ + # args[0] is the response content + self.logger.debug("receive data and enter queue") + msg = dict(args[0]) + if msg["detailed_info"] is not None: + if msg["status"] != 0: + self.logger.error(msg["detailed_info"]) + else: + self.logger.info(msg["detailed_info"]) + if msg["status"] != 0: + ex = ValueError(f"Bad response(status=={msg['status']}), detailed info: {msg['detailed_info']}") + msg_queue.put(ex) + else: + if msg_proc_func is not None: + try: + ret = msg_proc_func(msg["result"]) + except Exception as e: + self.logger.exception("Error when processing message.") + ret = e + else: + ret = msg["result"] + msg_queue.put(ret) + self.disconnect() + self.logger.debug("disconnected") + + self.logger.debug("try connecting") + self.connect_server() + self.logger.debug("connected") + # The pickle is for passing some parameters with special type(such as + # pd.Timestamp) + request_content = {"head": head_info, "body": pickle.dumps(request_content)} + self.sio.on(request_type + "_response", request_callback) + self.logger.debug("try sending") + self.sio.emit(request_type + "_request", request_content) + self.sio.wait() diff --git a/qlib/data/data.py b/qlib/data/data.py new file mode 100644 index 000000000..010e3668a --- /dev/null +++ b/qlib/data/data.py @@ -0,0 +1,1110 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import os +import abc +import six +import time +import queue +import bisect +import logging +import importlib +import traceback +import numpy as np +import pandas as pd +from multiprocessing import Pool + +from .cache import H +from ..config import C +from .ops import * +from ..log import get_module_logger +from ..utils import parse_field, read_bin, hash_args, normalize_cache_fields +from .base import Feature +from .cache import ServerDatasetCache, ServerExpressionCache + + +@six.add_metaclass(abc.ABCMeta) +class CalendarProvider(object): + """Calendar provider base class + + Provide calendar data. + """ + + @abc.abstractmethod + def calendar(self, start_time=None, end_time=None, freq="day", future=False): + """Get calendar of certain market in given time range. + + Parameters + ---------- + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency, available: year/quarter/month/week/day + future : bool + whether including future trading day + + Returns + ---------- + list + calendar list + """ + raise NotImplementedError("Subclass of CalendarProvider must implement `calendar` method") + + def locate_index(self, start_time, end_time, freq, future): + """Locate the start time index and end time index in a calendar under certain frequency. + + Parameters + ---------- + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency, available: year/quarter/month/week/day + future : bool + whether including future trading day + + Returns + ------- + pd.Timestamp + the real start time + pd.Timestamp + the real end time + int + the index of start time + int + the index of end time + """ + start_time = pd.Timestamp(start_time) + end_time = pd.Timestamp(end_time) + calendar, calendar_index = self._get_calendar(freq=freq, future=future) + if start_time not in calendar_index: + try: + start_time = calendar[bisect.bisect_left(calendar, start_time)] + except IndexError: + raise IndexError( + "`start_time` uses a future date, if you want to get future trading days, you can use: `future=True`" + ) + start_index = calendar_index[start_time] + if end_time not in calendar_index: + end_time = calendar[bisect.bisect_right(calendar, end_time) - 1] + end_index = calendar_index[end_time] + return start_time, end_time, start_index, end_index + + def _get_calendar(self, freq, future): + """Load calendar using memcache. + + Parameters + ---------- + freq : str + frequency of read calendar file + future : bool + whether including future trading day + + Returns + ------- + list + list of timestamps + dict + dict composed by timestamp as key and index as value for fast search + """ + flag = f"{freq}_future_{future}" + if flag in H["c"]: + _calendar, _calendar_index = H["c"][flag] + else: + _calendar = np.array(self._load_calendar(freq, future)) + _calendar_index = {x: i for i, x in enumerate(_calendar)} # for fast search + H["c"][flag] = _calendar, _calendar_index + return _calendar, _calendar_index + + def _uri(self, start_time, end_time, freq, future=False): + """Get the uri of calendar generation task.""" + return hash_args(start_time, end_time, freq, future) + + +@six.add_metaclass(abc.ABCMeta) +class InstrumentProvider(object): + """Instrument provider base class + + Provide instrument data. + """ + + @staticmethod + def instruments(market="all", filter_pipe=None): + """Get the general config dictionary for a base market adding several dynamic filters. + + Parameters + ---------- + market : str + market/industry/index shortname, e.g. all/sse/szse/sse50/csi300/csi500 + filter_pipe : list + the list of dynamic filters + + Returns + ---------- + dict + dict of stockpool config + {`market`=>base market name, `filter_pipe`=>list of filters} + + example : + {'market': 'csi500', + 'filter_pipe': [{'filter_type': 'ExpressionDFilter', + 'rule_expression': '$open<40', + 'filter_start_time': None, + 'filter_end_time': None, + 'keep': False}, + {'filter_type': 'NameDFilter', + 'name_rule_re': 'SH[0-9]{4}55', + 'filter_start_time': None, + 'filter_end_time': None}]} + """ + if filter_pipe is None: + filter_pipe = [] + config = {"market": market, "filter_pipe": []} + # the order of the filters will affect the result, so we need to keep + # the order + for filter_t in filter_pipe: + config["filter_pipe"].append(filter_t.to_config()) + return config + + @abc.abstractmethod + def list_instruments(self, instruments, start_time=None, end_time=None, freq="day", as_list=False): + """List the instruments based on a certain stockpool config. + + Parameters + ---------- + instruments : dict + stockpool config + start_time : str + start of the time range + end_time : str + end of the time range + as_list : bool + return instruments as list or dict + + Returns + ------- + dict or list + instruments list or dictionary with time spans + """ + raise NotImplementedError("Subclass of InstrumentProvider must implement `list_instruments` method") + + def _uri(self, instruments, start_time=None, end_time=None, freq="day", as_list=False): + return hash_args(instruments, start_time, end_time, freq, as_list) + + # instruments type + LIST = "LIST" + DICT = "DICT" + CONF = "CONF" + + @classmethod + def get_inst_type(cls, inst): + if "market" in inst: + return cls.CONF + if isinstance(inst, dict): + return cls.DICT + if isinstance(inst, (list, tuple, pd.Index, np.ndarray)): + return cls.LIST + raise ValueError(f"Unknown instrument type {inst}") + + +@six.add_metaclass(abc.ABCMeta) +class FeatureProvider(object): + """Feature provider class + + Provide feature data. + """ + + @abc.abstractmethod + def feature(self, instrument, field, start_time, end_time, freq): + """Get feature data. + + Parameters + ---------- + instrument : str + a certain instrument + field : str + a certain field of feature + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency, available: year/quarter/month/week/day + + Returns + ------- + pd.Series + data of a certain feature + """ + raise NotImplementedError("Subclass of FeatureProvider must implement `feature` method") + + +@six.add_metaclass(abc.ABCMeta) +class ExpressionProvider(object): + """Expression provider class + + Provide Expression data. + """ + + def __init__(self): + self.expression_instance_cache = {} + + def get_expression_instance(self, field): + try: + if field in self.expression_instance_cache: + expression = self.expression_instance_cache[field] + else: + expression = eval(parse_field(field)) + self.expression_instance_cache[field] = expression + except NameError as e: + get_module_logger("data").exception( + "ERROR: field [%s] contains invalid operator/variable [%s]" % (str(field), str(e).split()[1]) + ) + raise + except SyntaxError: + get_module_logger("data").exception("ERROR: field [%s] contains invalid syntax" % str(field)) + raise + return expression + + @abc.abstractmethod + def expression(self, instrument, field, start_time=None, end_time=None, freq="day"): + """Get Expression data. + + Parameters + ---------- + instrument : str + a certain instrument + field : str + a certain field of feature + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency, available: year/quarter/month/week/day + + Returns + ------- + pd.Series + data of a certain expression + """ + raise NotImplementedError("Subclass of ExpressionProvider must implement `Expression` method") + + +@six.add_metaclass(abc.ABCMeta) +class DatasetProvider(object): + """Dataset provider class + + Provide Dataset data. + """ + + @abc.abstractmethod + def dataset(self, instruments, fields, start_time=None, end_time=None, freq="day"): + """Get dataset data. + + Parameters + ---------- + instruments : list or dict + list/dict of instruments or dict of stockpool config + fields : list + list of feature instances + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency + + Returns + ---------- + pd.DataFrame + a pandas dataframe with index + """ + raise NotImplementedError("Subclass of DatasetProvider must implement `Dataset` method") + + def _uri( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=1, + **kwargs, + ): + """Get task uri, used when generating rabbitmq task in qlib_server + + Parameters + ---------- + instruments : list or dict + list/dict of instruments or dict of stockpool config + fields : list + list of feature instances + start_time : str + start of the time range + end_time : str + end of the time range + freq : str + time frequency + disk_cache : int + whether to skip(0)/use(1)/replace(2) disk_cache + + """ + return ServerDatasetCache._uri(instruments, fields, start_time, end_time, freq, disk_cache) + + @staticmethod + def get_instruments_d(instruments, freq): + """ + Parse different types of input instruments to output instruments_d + Wrong format of input instruments will lead to exception. + + """ + if isinstance(instruments, dict): + if "market" in instruments: + # dict of stockpool config + instruments_d = Inst.list_instruments(instruments=instruments, freq=freq, as_list=False) + else: + # dict of instruments and timestamp + instruments_d = instruments + elif isinstance(instruments, (list, tuple, pd.Index, np.ndarray)): + # list or tuple of a group of instruments + instruments_d = list(instruments) + else: + raise ValueError("Unsupported input type for param `instrument`") + return instruments_d + + @staticmethod + def get_column_names(fields): + """ + Get column names from input fields + + """ + if len(fields) == 0: + raise ValueError("fields cannot be empty") + fields = fields.copy() + column_names = [str(f) for f in fields] + return column_names + + @staticmethod + def parse_fields(fields): + # parse and check the input fields + return [ExpressionD.get_expression_instance(f) for f in fields] + + @staticmethod + def dataset_processor(instruments_d, column_names, start_time, end_time, freq): + """ + Load and process the data, return the data set. + - default using multi-kernel method. + + """ + normalize_column_names = normalize_cache_fields(column_names) + data = dict() + # One process for one task, so that the memory will be freed quicker. + if C.maxtasksperchild is None: + p = Pool(processes=C.kernels) + else: + p = Pool(processes=C.kernels, maxtasksperchild=C.maxtasksperchild) + + if isinstance(instruments_d, dict): + for inst, spans in instruments_d.items(): + data[inst] = p.apply_async( + DatasetProvider.expression_calculator, + args=( + inst, + start_time, + end_time, + freq, + normalize_column_names, + spans, + C, + ), + ) + else: + for inst in instruments_d: + data[inst] = p.apply_async( + DatasetProvider.expression_calculator, + args=( + inst, + start_time, + end_time, + freq, + normalize_column_names, + None, + C, + ), + ) + + p.close() + p.join() + + new_data = dict() + for inst in sorted(data.keys()): + if len(data[inst].get()) > 0: + # NOTE: Python version >= 3.6; in versions after python3.6, dict will always guarantee the insertion order + new_data[inst] = data[inst].get() + + if len(new_data) > 0: + data = pd.concat(new_data, names=["instrument"], sort=False) + data = ServerDatasetCache.cache_to_origin_data(data, column_names) + else: + data = pd.DataFrame(columns=column_names) + + return data + + @staticmethod + def expression_calculator(inst, start_time, end_time, freq, column_names, spans=None, C=None): + """ + Calculate the expressions for one instrument, return a df result. + If the expression has been calculated before, load from cache. + + return value: A data frame with index 'datetime' and other data columns. + + """ + # NOTE: This place is compatible with windows, windows multi-process is spawn + if getattr(ExpressionD, "_provider", None) is None: + register_all_wrappers() + + obj = dict() + for field in column_names: + # The client does not have expression provider, the data will be loaded from cache using static method. + obj[field] = ExpressionD.expression(inst, field, start_time, end_time, freq) + + data = pd.DataFrame(obj) + _calendar = Cal.calendar(freq=freq) + data.index = _calendar[data.index.values.astype(np.int)] + data.index.names = ["datetime"] + + if spans is None: + return data + else: + mask = np.zeros(len(data), dtype=np.bool) + for begin, end in spans: + mask |= (data.index >= begin) & (data.index <= end) + return data[mask] + + +class LocalCalendarProvider(CalendarProvider): + """Local calendar data provider class + + Provide calendar data from local data source. + """ + + def __init__(self, **kwargs): + self.remote = kwargs.get("remote", False) + + @property + def _uri_cal(self): + """Calendar file uri.""" + if self.remote: + return os.path.join(C.mount_path, "calendars", "{}.txt") + else: + return os.path.join(C.provider_uri, "calendars", "{}.txt") + + def _load_calendar(self, freq, future): + """Load original calendar timestamp from file. + + Parameters + ---------- + freq : str + frequency of read calendar file + + Returns + ---------- + list + list of timestamps + """ + if future: + fname = self._uri_cal.format(freq + "_future") + # if future calendar not exists, return current calendar + if not os.path.exists(fname): + get_module_logger("data").warning(f"{freq}_future.txt not exists, return current calendar!") + fname = self._uri_cal.format(freq) + else: + fname = self._uri_cal.format(freq) + if not os.path.exists(fname): + raise ValueError("calendar not exists for freq " + freq) + with open(fname) as f: + return [pd.Timestamp(x.strip()) for x in f] + + def calendar(self, start_time=None, end_time=None, freq="day", future=False): + _calendar, _calendar_index = self._get_calendar(freq, future) + if start_time == "None": + start_time = None + if end_time == "None": + end_time = None + # strip + if start_time: + start_time = pd.Timestamp(start_time) + if start_time > _calendar[-1]: + return np.array([]) + else: + start_time = _calendar[0] + if end_time: + end_time = pd.Timestamp(end_time) + if end_time < _calendar[0]: + return np.array([]) + else: + end_time = _calendar[-1] + _, _, si, ei = self.locate_index(start_time, end_time, freq, future) + return _calendar[si : ei + 1] + + +class LocalInstrumentProvider(InstrumentProvider): + """Local instrument data provider class + + Provide instrument data from local data source. + """ + + def __init__(self): + pass + + @property + def _uri_inst(self): + """Instrument file uri.""" + return os.path.join(C.provider_uri, "instruments", "{}.txt") + + def _load_instruments(self, market): + fname = self._uri_inst.format(market) + if not os.path.exists(fname): + raise ValueError("instruments not exists for market " + market) + _instruments = dict() + with open(fname) as f: + for line in f: + inst_time = line.strip().split() + inst = inst_time[0] + if len(inst_time) == 3: + # `day` + begin = inst_time[1] + end = inst_time[2] + elif len(inst_time) == 5: + # `1min` + begin = inst_time[1] + " " + inst_time[2] + end = inst_time[3] + " " + inst_time[4] + _instruments.setdefault(inst, []).append((pd.Timestamp(begin), pd.Timestamp(end))) + return _instruments + + def list_instruments(self, instruments, start_time=None, end_time=None, freq="day", as_list=False): + market = instruments["market"] + if market in H["i"]: + _instruments = H["i"][market] + else: + _instruments = self._load_instruments(market) + H["i"][market] = _instruments + # strip + # use calendar boundary + cal = Cal.calendar(freq=freq) + start_time = pd.Timestamp(start_time or cal[0]) + end_time = pd.Timestamp(end_time or cal[-1]) + _instruments_filtered = { + inst: list( + filter( + lambda x: x[0] <= x[1], + [(max(start_time, x[0]), min(end_time, x[1])) for x in spans], + ) + ) + for inst, spans in _instruments.items() + } + _instruments_filtered = {key: value for key, value in _instruments_filtered.items() if value} + # filter + filter_pipe = instruments["filter_pipe"] + for filter_config in filter_pipe: + from . import filter as F + + filter_t = getattr(F, filter_config["filter_type"]).from_config(filter_config) + _instruments_filtered = filter_t(_instruments_filtered, start_time, end_time, freq) + # as list + if as_list: + return list(_instruments_filtered) + return _instruments_filtered + + +class LocalFeatureProvider(FeatureProvider): + """Local feature data provider class + + Provide feature data from local data source. + """ + + def __init__(self, **kwargs): + self.remote = kwargs.get("remote", False) + + @property + def _uri_data(self): + """Static feature file uri.""" + if self.remote: + return os.path.join(C.mount_path, "features", "{}", "{}.{}.bin") + else: + return os.path.join(C.provider_uri, "features", "{}", "{}.{}.bin") + + def feature(self, instrument, field, start_index, end_index, freq): + # validate + field = str(field).lower()[1:] + uri_data = self._uri_data.format(instrument.lower(), field, freq) + if not os.path.exists(uri_data): + get_module_logger("data").warning("WARN: data not found for %s.%s" % (instrument, field)) + return pd.Series() + # raise ValueError('uri_data not found: ' + uri_data) + # load + series = read_bin(uri_data, start_index, end_index) + return series + + +class LocalExpressionProvider(ExpressionProvider): + """Local expression data provider class + + Provide expression data from local data source. + """ + + def __init__(self): + super().__init__() + + def expression(self, instrument, field, start_time=None, end_time=None, freq="day"): + expression = self.get_expression_instance(field) + start_time = pd.Timestamp(start_time) + end_time = pd.Timestamp(end_time) + _, _, start_index, end_index = Cal.locate_index(start_time, end_time, freq, future=False) + lft_etd, rght_etd = expression.get_extended_window_size() + series = expression.load(instrument, max(0, start_index - lft_etd), end_index + rght_etd, freq) + # Ensure that each column type is consistent + # FIXME: The stock data is currently float. If there is other types of data, this part needs to be re-implemented. + try: + series = series.astype(float) + except ValueError: + pass + if not series.empty: + series = series.loc[start_index:end_index] + return series + + +class LocalDatasetProvider(DatasetProvider): + """Local dataset data provider class + + Provide dataset data from local data source. + """ + + def __init__(self): + pass + + def dataset(self, instruments, fields, start_time=None, end_time=None, freq="day"): + instruments_d = self.get_instruments_d(instruments, freq) + column_names = self.get_column_names(fields) + cal = Cal.calendar(start_time, end_time, freq) + if len(cal) == 0: + return pd.DataFrame(columns=column_names) + start_time = cal[0] + end_time = cal[-1] + + data = self.dataset_processor(instruments_d, column_names, start_time, end_time, freq) + + return data + + @staticmethod + def multi_cache_walker(instruments, fields, start_time=None, end_time=None, freq="day"): + """ + This method is used to prepare the expression cache for the client. + Then the client will load the data from expression cache by itself. + + """ + instruments_d = DatasetProvider.get_instruments_d(instruments, freq) + column_names = DatasetProvider.get_column_names(fields) + cal = Cal.calendar(start_time, end_time, freq) + if len(cal) == 0: + return + start_time = cal[0] + end_time = cal[-1] + + if C.maxtasksperchild is None: + p = Pool(processes=C.kernels) + else: + p = Pool(processes=C.kernels, maxtasksperchild=C.maxtasksperchild) + + for inst in instruments_d: + p.apply_async( + LocalDatasetProvider.cache_walker, + args=( + inst, + start_time, + end_time, + freq, + column_names, + ), + ) + + p.close() + p.join() + + @staticmethod + def cache_walker(inst, start_time, end_time, freq, column_names): + """ + If the expressions of one instrument haven't been calculated before, + calculate it and write it into expression cache. + + """ + for field in column_names: + ExpressionD.expression(inst, field, start_time, end_time, freq) + + +class ClientCalendarProvider(CalendarProvider): + """Client calendar data provider class + + Provide calendar data by requesting data from server as a client. + """ + + def __init__(self): + self.conn = None + self.queue = queue.Queue() + + def set_conn(self, conn): + self.conn = conn + + def calendar(self, start_time=None, end_time=None, freq="day", future=False): + self.conn.send_request( + request_type="calendar", + request_content={ + "start_time": str(start_time), + "end_time": str(end_time), + "freq": freq, + "future": future, + }, + msg_queue=self.queue, + msg_proc_func=lambda response_content: [pd.Timestamp(c) for c in response_content], + ) + result = self.queue.get(timeout=C["timeout"]) + return result + + +class ClientInstrumentProvider(InstrumentProvider): + """Client instrument data provider class + + Provide instrument data by requesting data from server as a client. + """ + + def __init__(self): + self.conn = None + self.queue = queue.Queue() + + def set_conn(self, conn): + self.conn = conn + + def list_instruments(self, instruments, start_time=None, end_time=None, freq="day", as_list=False): + def inst_msg_proc_func(response_content): + if isinstance(response_content, dict): + instrument = { + i: [(pd.Timestamp(s), pd.Timestamp(e)) for s, e in t] for i, t in response_content.items() + } + else: + instrument = response_content + return instrument + + self.conn.send_request( + request_type="instrument", + request_content={ + "instruments": instruments, + "start_time": str(start_time), + "end_time": str(end_time), + "freq": freq, + "as_list": as_list, + }, + msg_queue=self.queue, + msg_proc_func=inst_msg_proc_func, + ) + result = self.queue.get(timeout=C["timeout"]) + if isinstance(result, Exception): + raise result + get_module_logger("data").debug("get result") + return result + + +class ClientDatasetProvider(DatasetProvider): + """Client dataset data provider class + + Provide dataset data by requesting data from server as a client. + """ + + def __init__(self): + self.conn = None + + def set_conn(self, conn): + self.conn = conn + self.queue = queue.Queue() + + def dataset( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=0, + return_uri=False, + ): + if Inst.get_inst_type(instruments) == Inst.DICT: + get_module_logger("data").warning( + "Getting features from a dict of instruments is not recommended because the features will not be " + "cached! " + "The dict of instruments will be cleaned every day." + ) + + if disk_cache == 0: + """ + Call the server to generate the expression cache. + Then load the data from the expression cache directly. + - default using multi-kernel method. + + """ + self.conn.send_request( + request_type="feature", + request_content={ + "instruments": instruments, + "fields": fields, + "start_time": start_time, + "end_time": end_time, + "freq": freq, + "disk_cache": 0, + }, + msg_queue=self.queue, + ) + feature_uri = self.queue.get(timeout=C["timeout"]) + if isinstance(feature_uri, Exception): + raise feature_uri + else: + instruments_d = self.get_instruments_d(instruments, freq) + column_names = self.get_column_names(fields) + cal = Cal.calendar(start_time, end_time, freq) + if len(cal) == 0: + return pd.DataFrame(columns=column_names) + start_time = cal[0] + end_time = cal[-1] + + data = self.dataset_processor(instruments_d, column_names, start_time, end_time, freq) + if return_uri: + return data, feature_uri + else: + return data + else: + + """ + Call the server to generate the data-set cache, get the uri of the cache file. + Then load the data from the file on NFS directly. + - using single-process implementation. + + """ + self.conn.send_request( + request_type="feature", + request_content={ + "instruments": instruments, + "fields": fields, + "start_time": start_time, + "end_time": end_time, + "freq": freq, + "disk_cache": 1, + }, + msg_queue=self.queue, + ) + # - Done in callback + feature_uri = self.queue.get(timeout=C["timeout"]) + if isinstance(feature_uri, Exception): + raise feature_uri + get_module_logger("data").debug("get result") + try: + # pre-mound nfs, used for demo + mnt_feature_uri = os.path.join(C.mount_path, C.dataset_cache_dir_name, feature_uri) + df = ServerDatasetCache.read_data_from_cache(mnt_feature_uri, start_time, end_time, fields) + get_module_logger("data").debug("finish slicing data") + if return_uri: + return df, feature_uri + return df + except AttributeError: + raise IOError("Unable to fetch instruments from remote server!") + + +class BaseProvider: + """Local provider class + + To keep compatible with old qlib provider. + """ + + def calendar(self, start_time=None, end_time=None, freq="day", future=False): + return Cal.calendar(start_time, end_time, freq, future=future) + + def instruments(self, market="all", filter_pipe=None, start_time=None, end_time=None): + if start_time is not None or end_time is not None: + get_module_logger("Provider").warning( + "The instruments corresponds to a stock pool. " + "Parameters `start_time` and `end_time` does not take effect now." + ) + return InstrumentProvider.instruments(market, filter_pipe) + + def list_instruments(self, instruments, start_time=None, end_time=None, freq="day", as_list=False): + return Inst.list_instruments(instruments, start_time, end_time, freq, as_list) + + def features( + self, + instruments, + fields, + start_time=None, + end_time=None, + freq="day", + disk_cache=None, + ): + """ + disk_cache : int + whether to skip(0)/use(1)/replace(2) disk_cache + + This function will try to use cache method which has a keyword `disk_cache`, + and will use provider method if a type error is raised because the DatasetD instance + is a provider class. + """ + disk_cache = C.default_disk_cache if disk_cache is None else disk_cache + if C.disable_disk_cache: + disk_cache = False + try: + return DatasetD.dataset(instruments, fields, start_time, end_time, freq, disk_cache) + except TypeError: + return DatasetD.dataset(instruments, fields, start_time, end_time, freq) + + +class LocalProvider(BaseProvider): + def _uri(self, type, **kwargs): + """_uri + The server hope to get the uri of the request. The uri will be decided + by the dataprovider. For ex, different cache layer has different uri. + + :param type: The type of resource for the uri + :param **kwargs: + """ + if type == "calendar": + return Cal._uri(**kwargs) + elif type == "instrument": + return Inst._uri(**kwargs) + elif type == "feature": + return DatasetD._uri(**kwargs) + + def features_uri(self, instruments, fields, start_time, end_time, freq, disk_cache=1): + """features_uri + + Return the uri of the generated cache of features/dataset + + :param disk_cache: + :param instruments: + :param fields: + :param start_time: + :param end_time: + :param freq: + """ + return DatasetD._dataset_uri(instruments, fields, start_time, end_time, freq, disk_cache) + + +class ClientProvider(BaseProvider): + """Client Provider + + Requesting data from server as a client. Can propose requests: + - Calendar : Directly respond a list of calendars + - Instruments (without filter): Directly respond a list/dict of instruments + - Instruments (with filters): Respond a list/dict of instruments + - Features : Respond a cache uri + The general workflow is described as follows: + When the user use client provider to propose a request, the client provider will connect the server and send the request. The client will start to wait for the response. The response will be made instantly indicating whether the cache is available. The waiting procedure will terminate only when the client get the reponse saying `feature_available` is true. + `BUG` : Everytime we make request for certain data we need to connect to the server, wait for the response and disconnect from it. We can't make a sequence of requests within one connection. You can refer to https://python-socketio.readthedocs.io/en/latest/client.html for documentation of python-socketIO client. + """ + + def __init__(self): + from .client import Client + + self.client = Client(C.flask_server, C.flask_port) + self.logger = get_module_logger(self.__class__.__name__) + if isinstance(Cal, ClientCalendarProvider): + Cal.set_conn(self.client) + Inst.set_conn(self.client) + if hasattr(DatasetD, "provider"): + DatasetD.provider.set_conn(self.client) + else: + DatasetD.set_conn(self.client) + + +class Wrapper(object): + """Data Provider Wrapper""" + + def __init__(self): + self._provider = None + + def register(self, provider): + self._provider = provider + + def __getattr__(self, key): + if self._provider is None: + raise AttributeError("Please run qlib.init() first using qlib") + return getattr(self._provider, key) + + +def get_cls_from_name(cls_name): + return getattr(importlib.import_module(".data", package="qlib"), cls_name) + + +def get_provider_obj(config, **params): + if isinstance(config, dict): + params.update(config["kwargs"]) + config = config["class"] + return get_cls_from_name(config)(**params) + + +def register_wrapper(wrapper, cls_or_obj): + """register_wrapper + + :param wrapper: A wrapper of all kinds of providers + :param cls_or_obj: A class or class name or object instance in data/data.py + """ + if isinstance(cls_or_obj, str): + cls_or_obj = get_cls_from_name(cls_or_obj) + obj = cls_or_obj() if isinstance(cls_or_obj, type) else cls_or_obj + wrapper.register(obj) + + +Cal = Wrapper() +Inst = Wrapper() +FeatureD = Wrapper() +ExpressionD = Wrapper() +DatasetD = Wrapper() +D = Wrapper() + + +def register_all_wrappers(): + """register_all_wrappers""" + logger = get_module_logger("data") + + _calendar_provider = get_provider_obj(C.calendar_provider) + if getattr(C, "calendar_cache", None) is not None: + _calendar_provider = get_provider_obj(C.calendar_cache, provider=_calendar_provider) + register_wrapper(Cal, _calendar_provider) + logger.debug(f"registering Cal {C.calendar_provider}-{C.calenar_cache}") + + register_wrapper(Inst, C.instrument_provider) + logger.debug(f"registering Inst {C.instrument_provider}") + + if getattr(C, "feature_provider", None) is not None: + feature_provider = get_provider_obj(C.feature_provider) + register_wrapper(FeatureD, feature_provider) + logger.debug(f"registering FeatureD {C.feature_provider}") + + if getattr(C, "expression_provider", None) is not None: + # This provider is unnecessary in client provider + _eprovider = get_provider_obj(C.expression_provider) + if getattr(C, "expression_cache", None) is not None: + _eprovider = get_provider_obj(C.expression_cache, provider=_eprovider) + register_wrapper(ExpressionD, _eprovider) + logger.debug(f"registering ExpressioneD {C.expression_provider}-{C.expression_cache}") + + _dprovider = get_provider_obj(C.dataset_provider) + if getattr(C, "dataset_cache", None) is not None: + _dprovider = get_provider_obj(C.dataset_cache, provider=_dprovider) + register_wrapper(DatasetD, _dprovider) + logger.debug(f"registering DataseteD {C.dataset_provider}-{C.dataset_cache}") + + register_wrapper(D, C.provider) + logger.debug(f"registering D {C.provider}") diff --git a/qlib/data/filter.py b/qlib/data/filter.py new file mode 100644 index 000000000..1552aeee7 --- /dev/null +++ b/qlib/data/filter.py @@ -0,0 +1,375 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from __future__ import print_function +from abc import abstractmethod + +import re +import pandas as pd +import numpy as np +import six +import abc + +from .data import Cal, DatasetD + + +@six.add_metaclass(abc.ABCMeta) +class BaseDFilter(object): + """Dynamic Instruments Filter Abstract class + + Users can override this class to construct their own filter + + Override __init__ to input filter regulations + + Override filter_main to use the regulations to filter instruments + """ + + def __init__(self): + pass + + @staticmethod + def from_config(config): + """Construct an instance from config dict. + + Parameters + ---------- + config : dict + dict of config parameters + """ + raise NotImplementedError("Subclass of BaseDFilter must reimplement `from_config` method") + + @abstractmethod + def to_config(self): + """Construct an instance from config dict. + + Returns + ---------- + dict + return the dict of config parameters + """ + raise NotImplementedError("Subclass of BaseDFilter must reimplement `to_config` method") + + +@six.add_metaclass(abc.ABCMeta) +class SeriesDFilter(BaseDFilter): + """Dynamic Instruments Filter Abstract class to filter a series of certain features + + Filters should provide parameters: + + - filter start time + - filter end time + - filter rule + + Override __init__ to assign a certain rule to filter the series. + + Override _getFilterSeries to use the rule to filter the series and get a dict of {inst => series}, or override filter_main for more advanced series filter rule + """ + + def __init__(self, fstart_time=None, fend_time=None): + """Init function for filter base class. + Filter a set of instruments based on a certain rule within a certain period assigned by fstart_time and fend_time. + + Parameters + ---------- + fstart_time: str + the time for the filter rule to start filter the instruments + fend_time: str + the time for the filter rule to stop filter the instruments + """ + super(SeriesDFilter, self).__init__() + self.filter_start_time = pd.Timestamp(fstart_time) if fstart_time else None + self.filter_end_time = pd.Timestamp(fend_time) if fend_time else None + + def _getTimeBound(self, instruments): + """Get time bound for all instruments. + + Parameters + ---------- + instruments: dict + the dict of instruments in the form {instrument_name => list of timestamp tuple} + + Returns + ---------- + pd.Timestamp, pd.Timestamp + the lower time bound and upper time bound of all the instruments + """ + trange = Cal.calendar(freq=self.filter_freq) + ubound, lbound = trange[0], trange[-1] + for _, timestamp in instruments.items(): + if timestamp: + lbound = timestamp[0][0] if timestamp[0][0] < lbound else lbound + ubound = timestamp[-1][-1] if timestamp[-1][-1] > ubound else ubound + return lbound, ubound + + def _toSeries(self, time_range, target_timestamp): + """Convert the target timestamp to a pandas series of bool value within a time range. + Make the time inside the target_timestamp range TRUE, others FALSE. + + Parameters + ---------- + time_range : D.calendar + the time range of the instruments + target_timestamp : list + the list of tuple (timestamp, timestamp) + + Returns + ---------- + pd.Series + the series of bool value for an instrument + """ + # Construct a whole dict of {date => bool} + timestamp_series = {timestamp: False for timestamp in time_range} + # Convert to pd.Series + timestamp_series = pd.Series(timestamp_series) + # Fill the date within target_timestamp with TRUE + for start, end in target_timestamp: + timestamp_series[Cal.calendar(start_time=start, end_time=end, freq=self.filter_freq)] = True + return timestamp_series + + def _filterSeries(self, timestamp_series, filter_series): + """Filter the timestamp series with filter series by using element-wise AND operation of the two series + + Parameters + ---------- + timestamp_series : pd.Series + the series of bool value indicating existing time + filter_series : pd.Series + the series of bool value indicating filter feature + + Returns + ---------- + pd.Series + the series of bool value indicating whether the date satisfies the filter condition and exists in target timestamp + """ + fstart, fend = list(filter_series.keys())[0], list(filter_series.keys())[-1] + timestamp_series[fstart:fend] = timestamp_series[fstart:fend] & filter_series + return timestamp_series + + def _toTimestamp(self, timestamp_series): + """Convert the timestamp series to a list of tuple (timestamp, timestamp) indicating a continuous range of TRUE + + Parameters + ---------- + timestamp_series: pd.Series + the series of bool value after being filtered + + Returns + ---------- + list + the list of tuple (timestamp, timestamp) + """ + # sort the timestamp_series according to the timestamps + timestamp_series.sort_index() + timestamp = [] + _lbool = None + _ltime = None + for _ts, _bool in timestamp_series.items(): + # there is likely to be NAN when the filter series don't have the + # bool value, so we just change the NAN into False + if _bool == np.nan: + _bool = False + if _lbool is None: + _cur_start = _ts + _lbool = _bool + _ltime = _ts + continue + if (_lbool, _bool) == (True, False): + if _cur_start: + timestamp.append((_cur_start, _ltime)) + elif (_lbool, _bool) == (False, True): + _cur_start = _ts + _lbool = _bool + _ltime = _ts + if _lbool: + timestamp.append((_cur_start, _ltime)) + return timestamp + + def __call__(self, instruments, start_time=None, end_time=None, freq="day"): + """Call this filter to get filtered instruments list""" + self.filter_freq = freq + return self.filter_main(instruments, start_time, end_time) + + @abstractmethod + def _getFilterSeries(self, instruments, fstart, fend): + """Get filter series based on the rules assigned during the initialization and the input time range. + + Parameters + ---------- + instruments : dict + the dict of instruments to be filtered + fstart : pd.Timestamp + start time of filter + fend : pd.Timestamp + end time of filter + + .. note:: fstart/fend indicates the intersection of instruments start/end time and filter start/end time + + Returns + ---------- + pd.Dataframe + a series of {pd.Timestamp => bool} + """ + raise NotImplementedError("Subclass of SeriesDFilter must reimplement `getFilterSeries` method") + + def filter_main(self, instruments, start_time=None, end_time=None): + """Implement this method to filter the instruments. + + Parameters + ---------- + instruments: dict + input instruments to be filtered + start_time: str + start of the time range + end_time: str + end of the time range + + Returns + ---------- + dict + filtered instruments, same structure as input instruments + """ + lbound, ubound = self._getTimeBound(instruments) + start_time = pd.Timestamp(start_time or lbound) + end_time = pd.Timestamp(end_time or ubound) + _instruments_filtered = {} + _all_calendar = Cal.calendar(start_time=start_time, end_time=end_time, freq=self.filter_freq) + _filter_calendar = Cal.calendar( + start_time=self.filter_start_time and max(self.filter_start_time, _all_calendar[0]) or _all_calendar[0], + end_time=self.filter_end_time and min(self.filter_end_time, _all_calendar[-1]) or _all_calendar[-1], + freq=self.filter_freq, + ) + _all_filter_series = self._getFilterSeries(instruments, _filter_calendar[0], _filter_calendar[-1]) + for inst, timestamp in instruments.items(): + # Construct a whole map of date + _timestamp_series = self._toSeries(_all_calendar, timestamp) + # Get filter series + if inst in _all_filter_series: + _filter_series = _all_filter_series[inst] + else: + if self.keep: + _filter_series = pd.Series({timestamp: True for timestamp in _filter_calendar}) + else: + _filter_series = pd.Series({timestamp: False for timestamp in _filter_calendar}) + # Calculate bool value within the range of filter + _timestamp_series = self._filterSeries(_timestamp_series, _filter_series) + # Reform the map to (start_timestamp, end_timestamp) format + _timestamp = self._toTimestamp(_timestamp_series) + # Remove empty timestamp + if _timestamp: + _instruments_filtered[inst] = _timestamp + return _instruments_filtered + + +class NameDFilter(SeriesDFilter): + """Name dynamic instrument filter + + Filter the instruments based on a regulated name format. + + A name rule regular expression is required. + """ + + def __init__(self, name_rule_re, fstart_time=None, fend_time=None): + """Init function for name filter class + + params: + ------ + name_rule_re: str + regular expression for the name rule + """ + super(NameDFilter, self).__init__(fstart_time, fend_time) + self.name_rule_re = name_rule_re + + def _getFilterSeries(self, instruments, fstart, fend): + all_filter_series = {} + filter_calendar = Cal.calendar(start_time=fstart, end_time=fend, freq=self.filter_freq) + for inst, timestamp in instruments.items(): + if re.match(self.name_rule_re, inst): + _filter_series = pd.Series({timestamp: True for timestamp in filter_calendar}) + else: + _filter_series = pd.Series({timestamp: False for timestamp in filter_calendar}) + all_filter_series[inst] = _filter_series + return all_filter_series + + @staticmethod + def from_config(config): + return NameDFilter( + name_rule_re=config["name_rule_re"], + fstart_time=config["filter_start_time"], + fend_time=config["filter_end_time"], + ) + + def to_config(self): + return { + "filter_type": "NameDFilter", + "name_rule_re": self.name_rule_re, + "filter_start_time": str(self.filter_start_time) if self.filter_start_time else self.filter_start_time, + "filter_end_time": str(self.filter_end_time) if self.filter_end_time else self.filter_end_time, + } + + +class ExpressionDFilter(SeriesDFilter): + """Expression dynamic instrument filter + + Filter the instruments based on a certain expression. + + An expression rule indicating a certain feature field is required. + + Examples + ---------- + - *basic features filter* : rule_expression = '$close/$open>5' + - *cross-sectional features filter* : rule_expression = '$rank($close)<10' + - *time-sequence features filter* : rule_expression = '$Ref($close, 3)>100' + """ + + def __init__(self, rule_expression, fstart_time=None, fend_time=None, keep=False): + """Init function for expression filter class + + params: + ------ + fstart_time: str + filter the feature starting from this time + fend_time: str + filter the feature ending by this time + rule_expression: str + an input expression for the rule + keep: bool + whether to keep the instruments of which features don't exist in the filter time span + """ + super(ExpressionDFilter, self).__init__(fstart_time, fend_time) + self.rule_expression = rule_expression + self.keep = keep + + def _getFilterSeries(self, instruments, fstart, fend): + # do not use dataset cache + try: + _features = DatasetD.dataset( + instruments, + [self.rule_expression], + fstart, + fend, + freq=self.filter_freq, + disk_cache=0, + ) + except TypeError: + # use LocalDatasetProvider + _features = DatasetD.dataset(instruments, [self.rule_expression], fstart, fend, freq=self.filter_freq) + rule_expression_field_name = list(_features.keys())[0] + all_filter_series = _features[rule_expression_field_name] + return all_filter_series + + def from_config(config): + return ExpressionDFilter( + rule_expression=config["rule_expression"], + fstart_time=config["filter_start_time"], + fend_time=config["filter_end_time"], + keep=config["keep"], + ) + + def to_config(self): + return { + "filter_type": "ExpressionDFilter", + "rule_expression": self.rule_expression, + "filter_start_time": str(self.filter_start_time) if self.filter_start_time else self.filter_start_time, + "filter_end_time": str(self.filter_end_time) if self.filter_end_time else self.filter_end_time, + "keep": self.keep, + } diff --git a/qlib/data/ops.py b/qlib/data/ops.py new file mode 100644 index 000000000..104296a0e --- /dev/null +++ b/qlib/data/ops.py @@ -0,0 +1,1405 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import numpy as np +import pandas as pd + +from .base import Expression, ExpressionOps +from ._libs.rolling import rolling_slope, rolling_rsquare, rolling_resi +from ._libs.expanding import expanding_slope, expanding_rsquare, expanding_resi +from ..log import get_module_logger + +__all__ = ( + "Ref", + "Max", + "Min", + "Sum", + "Mean", + "Std", + "Var", + "Skew", + "Kurt", + "Med", + "Mad", + "Slope", + "Rsquare", + "Resi", + "Rank", + "Quantile", + "Count", + "EMA", + "WMA", + "Corr", + "Cov", + "Delta", + "Abs", + "Sign", + "Log", + "Power", + "Add", + "Sub", + "Mul", + "Div", + "Greater", + "Less", + "And", + "Or", + "Not", + "Gt", + "Ge", + "Lt", + "Le", + "Eq", + "Ne", + "Mask", + "IdxMax", + "IdxMin", + "If", +) + +np.seterr(invalid="ignore") + +#################### Element-Wise Operator #################### + + +class ElemOperator(ExpressionOps): + """Element-wise Operator + + Parameters + ---------- + feature : Expression + feature instance + func : str + feature operation method + + Returns + ---------- + Expression + feature operation output + """ + + def __init__(self, feature, func): + self.feature = feature + self.func = func + + def __str__(self): + return "{}({})".format(type(self).__name__, self.feature) + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + return getattr(np, self.func)(series) + + def get_longest_back_rolling(self): + return self.feature.get_longest_back_rolling() + + def get_extended_window_size(self): + return self.feature.get_extended_window_size() + + +class Abs(ElemOperator): + """Feature Absolute Value + + Parameters + ---------- + feature : Expression + feature instance + + Returns + ---------- + Expression + a feature instance with absolute output + """ + + def __init__(self, feature): + super(Abs, self).__init__(feature, "abs") + + +class Sign(ElemOperator): + """Feature Sign + + Parameters + ---------- + feature : Expression + feature instance + + Returns + ---------- + Expression + a feature instance with sign + """ + + def __init__(self, feature): + super(Sign, self).__init__(feature, "sign") + + +class Log(ElemOperator): + """Feature Log + + Parameters + ---------- + feature : Expression + feature instance + + Returns + ---------- + Expression + a feature instance with log + """ + + def __init__(self, feature): + super(Log, self).__init__(feature, "log") + + +class Power(ElemOperator): + """Feature Power + + Parameters + ---------- + feature : Expression + feature instance + + Returns + ---------- + Expression + a feature instance with power + """ + + def __init__(self, feature, exponent): + super(Power, self).__init__(feature, "power") + self.exponent = exponent + + def __str__(self): + return "{}({},{})".format(type(self).__name__, self.feature, self.exponent) + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + return getattr(np, self.func)(series, self.exponent) + + +class Mask(ElemOperator): + """Feature Mask + + Parameters + ---------- + feature : Expression + feature instance + instrument : str + instrument mask + + Returns + ---------- + Expression + a feature instance with masked instrument + """ + + def __init__(self, feature, instrument): + super(Mask, self).__init__(feature, "mask") + self.instrument = instrument + + def __str__(self): + return "{}({},{})".format(type(self).__name__, self.feature, self.instrument.lower()) + + def _load_internal(self, instrument, start_index, end_index, freq): + return self.feature.load(self.instrument, start_index, end_index, freq) + + +class Not(ElemOperator): + """Not Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + feature elementwise not output + """ + + def __init__(self, feature): + super(Not, self).__init__(feature, "bitwise_not") + + +#################### Pair-Wise Operator #################### +class PairOperator(ExpressionOps): + """Pair-wise operator + + Parameters + ---------- + feature_left : Expression + feature instance or numeric value + feature_right : Expression + feature instance or numeric value + func : str + operator function + + Returns + ---------- + Feature: + two features' operation output + """ + + def __init__(self, feature_left, feature_right, func): + self.feature_left = feature_left + self.feature_right = feature_right + self.func = func + + def __str__(self): + return "{}({},{})".format(type(self).__name__, self.feature_left, self.feature_right) + + def _load_internal(self, instrument, start_index, end_index, freq): + assert any( + [isinstance(self.feature_left, Expression), self.feature_right, Expression] + ), "at least one of two inputs is Expression instance" + if isinstance(self.feature_left, Expression): + series_left = self.feature_left.load(instrument, start_index, end_index, freq) + else: + series_left = self.feature_left # numeric value + if isinstance(self.feature_right, Expression): + series_right = self.feature_right.load(instrument, start_index, end_index, freq) + else: + series_right = self.feature_right + return getattr(np, self.func)(series_left, series_right) + + def get_longest_back_rolling(self): + if isinstance(self.feature_left, Expression): + left_br = self.feature_left.get_longest_back_rolling() + else: + left_br = 0 + + if isinstance(self.feature_right, Expression): + right_br = self.feature_right.get_longest_back_rolling() + else: + right_br = 0 + return max(left_br, right_br) + + def get_extended_window_size(self): + if isinstance(self.feature_left, Expression): + ll, lr = self.feature_left.get_extended_window_size() + else: + ll, lr = 0, 0 + + if isinstance(self.feature_right, Expression): + rl, rr = self.feature_right.get_extended_window_size() + else: + rl, rr = 0, 0 + return max(ll, rl), max(lr, rr) + + +class Add(PairOperator): + """Add Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' sum + """ + + def __init__(self, feature_left, feature_right): + super(Add, self).__init__(feature_left, feature_right, "add") + + +class Sub(PairOperator): + """Subtract Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' subtraction + """ + + def __init__(self, feature_left, feature_right): + super(Sub, self).__init__(feature_left, feature_right, "subtract") + + +class Mul(PairOperator): + """Multiply Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' product + """ + + def __init__(self, feature_left, feature_right): + super(Mul, self).__init__(feature_left, feature_right, "multiply") + + +class Div(PairOperator): + """Division Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' division + """ + + def __init__(self, feature_left, feature_right): + super(Div, self).__init__(feature_left, feature_right, "divide") + + +class Greater(PairOperator): + """Greater Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + greater elements taken from the input two features + """ + + def __init__(self, feature_left, feature_right): + super(Greater, self).__init__(feature_left, feature_right, "maximum") + + +class Less(PairOperator): + """Less Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + smaller elements taken from the input two features + """ + + def __init__(self, feature_left, feature_right): + super(Less, self).__init__(feature_left, feature_right, "minimum") + + +class Gt(PairOperator): + """Greater Than Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left > right` + """ + + def __init__(self, feature_left, feature_right): + super(Gt, self).__init__(feature_left, feature_right, "greater") + + +class Ge(PairOperator): + """Greater Equal Than Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left >= right` + """ + + def __init__(self, feature_left, feature_right): + super(Ge, self).__init__(feature_left, feature_right, "greater_equal") + + +class Lt(PairOperator): + """Less Than Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left < right` + """ + + def __init__(self, feature_left, feature_right): + super(Lt, self).__init__(feature_left, feature_right, "less") + + +class Le(PairOperator): + """Less Equal Than Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left <= right` + """ + + def __init__(self, feature_left, feature_right): + super(Le, self).__init__(feature_left, feature_right, "less_equal") + + +class Eq(PairOperator): + """Equal Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left == right` + """ + + def __init__(self, feature_left, feature_right): + super(Eq, self).__init__(feature_left, feature_right, "equal") + + +class Ne(PairOperator): + """Not Equal Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + bool series indicate `left != right` + """ + + def __init__(self, feature_left, feature_right): + super(Ne, self).__init__(feature_left, feature_right, "not_equal") + + +class And(PairOperator): + """And Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' row by row & output + """ + + def __init__(self, feature_left, feature_right): + super(And, self).__init__(feature_left, feature_right, "bitwise_and") + + +class Or(PairOperator): + """Or Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + + Returns + ---------- + Feature: + two features' row by row | outputs + """ + + def __init__(self, feature_left, feature_right): + super(Or, self).__init__(feature_left, feature_right, "bitwise_or") + + +#################### Triple-wise Operator #################### +class If(ExpressionOps): + """If Operator + + Parameters + ---------- + condition : Expression + feature instance with bool values as condition + feature_left : Expression + feature instance + feature_right : Expression + feature instance + """ + + def __init__(self, condition, feature_left, feature_right): + self.condition = condition + self.feature_left = feature_left + self.feature_right = feature_right + + def __str__(self): + return "If({},{},{})".format(self.condition, self.feature_left, self.feature_right) + + def _load_internal(self, instrument, start_index, end_index, freq): + series_cond = self.condition.load(instrument, start_index, end_index, freq) + if isinstance(self.feature_left, Expression): + series_left = self.feature_left.load(instrument, start_index, end_index, freq) + else: + series_left = self.feature_left + if isinstance(self.feature_right, Expression): + series_right = self.feature_right.load(instrument, start_index, end_index, freq) + else: + series_right = self.feature_right + series = pd.Series(np.where(series_cond, series_left, series_right), index=series_cond.index) + return series + + def get_longest_back_rolling(self): + if isinstance(self.feature_left, Expression): + left_br = self.feature_left.get_longest_back_rolling() + else: + left_br = 0 + + if isinstance(self.feature_right, Expression): + right_br = self.feature_right.get_longest_back_rolling() + else: + right_br = 0 + + if isinstance(self.condition, Expression): + c_br = self.condition.get_longest_back_rolling() + else: + c_br = 0 + return max(left_br, right_br, c_br) + + def get_extended_window_size(self): + if isinstance(self.feature_left, Expression): + ll, lr = self.feature_left.get_extended_window_size() + else: + ll, lr = 0, 0 + + if isinstance(self.feature_right, Expression): + rl, rr = self.feature_right.get_extended_window_size() + else: + rl, rr = 0, 0 + + if isinstance(self.condition, Expression): + cl, cr = self.condition.get_extended_window_size() + else: + cl, cr = 0, 0 + return max(ll, rl, cl), max(lr, rr, cr) + + +#################### Rolling #################### +# NOTE: methods like `rolling.mean` are optimized with cython, +# and are super faster than `rolling.apply(np.mean)` + + +class Rolling(ExpressionOps): + """Rolling Operator + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + func : str + rolling method + + Returns + ---------- + Expression + rolling outputs + """ + + def __init__(self, feature, N, func): + self.feature = feature + self.N = N + self.func = func + + def __str__(self): + return "{}({},{})".format(type(self).__name__, self.feature, self.N) + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + # NOTE: remove all null check, + # now it's user's responsibility to decide whether use features in null days + # isnull = series.isnull() # NOTE: isnull = NaN, inf is not null + if self.N == 0: + series = getattr(series.expanding(min_periods=1), self.func)() + else: + series = getattr(series.rolling(self.N, min_periods=1), self.func)() + # series.iloc[:self.N-1] = np.nan + # series[isnull] = np.nan + return series + + def get_longest_back_rolling(self): + if self.N == 0: + return np.inf + return self.feature.get_longest_back_rolling() + self.N - 1 + + def get_extended_window_size(self): + if self.N == 0: + # FIXME: How to make this accurate and efficiently? Or should we + # remove such support for N == 0? + get_module_logger(self.__class__.__name__).warning("The Rolling(ATTR, 0) will not be accurately calculated") + return self.feature.get_extended_window_size() + else: + lft_etd, rght_etd = self.feature.get_extended_window_size() + lft_etd = max(lft_etd + self.N - 1, lft_etd) + return lft_etd, rght_etd + + +class Ref(Rolling): + """Feature Reference + + Parameters + ---------- + feature : Expression + feature instance + N : int + N = 0, retrieve the first data; N > 0, retrieve data of N periods ago; N < 0, future data + + Returns + ---------- + Expression + a feature instance with target reference + """ + + def __init__(self, feature, N): + super(Ref, self).__init__(feature, N, "ref") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + # N = 0, return first day + if series.empty: + return series # Pandas bug, see: https://github.com/pandas-dev/pandas/issues/21049 + elif self.N == 0: + series = pd.Series(series.iloc[0], index=series.index) + else: + series = series.shift(self.N) # copy + return series + + def get_longest_back_rolling(self): + if self.N == 0: + return np.inf + return self.feature.get_longest_back_rolling() + self.N + + def get_extended_window_size(self): + if self.N == 0: + get_module_logger(self.__class__.__name__).warning("The Ref(ATTR, 0) will not be accurately calculated") + return self.feature.get_extended_window_size() + else: + lft_etd, rght_etd = self.feature.get_extended_window_size() + lft_etd = max(lft_etd + self.N, lft_etd) + rght_etd = max(rght_etd - self.N, rght_etd) + return lft_etd, rght_etd + + +class Mean(Rolling): + """Rolling Mean (MA) + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling average + """ + + def __init__(self, feature, N): + super(Mean, self).__init__(feature, N, "mean") + + +class Sum(Rolling): + """Rolling Sum + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling sum + """ + + def __init__(self, feature, N): + super(Sum, self).__init__(feature, N, "sum") + + +class Std(Rolling): + """Rolling Std + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling std + """ + + def __init__(self, feature, N): + super(Std, self).__init__(feature, N, "std") + + +class Var(Rolling): + """Rolling Variance + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling variance + """ + + def __init__(self, feature, N): + super(Var, self).__init__(feature, N, "var") + + +class Skew(Rolling): + """Rolling Skewness + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling skewness + """ + + def __init__(self, feature, N): + super(Skew, self).__init__(feature, N, "skew") + + +class Kurt(Rolling): + """Rolling Kurtosis + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling kurtosis + """ + + def __init__(self, feature, N): + super(Kurt, self).__init__(feature, N, "kurt") + + +class Max(Rolling): + """Rolling Max + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling max + """ + + def __init__(self, feature, N): + super(Max, self).__init__(feature, N, "max") + + +class IdxMax(Rolling): + """Rolling Max Index + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling max index + """ + + def __init__(self, feature, N): + super(IdxMax, self).__init__(feature, N, "idxmax") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = series.expanding(min_periods=1).apply(lambda x: x.argmax() + 1, raw=True) + else: + series = series.rolling(self.N, min_periods=1).apply( + lambda x: x.argmax() + 1, + raw=True, + ) + return series + + +class Min(Rolling): + """Rolling Min + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling min + """ + + def __init__(self, feature, N): + super(Min, self).__init__(feature, N, "min") + + +class IdxMin(Rolling): + """Rolling Min Index + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling min index + """ + + def __init__(self, feature, N): + super(IdxMin, self).__init__(feature, N, "idxmin") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = series.expanding(min_periods=1).apply(lambda x: x.argmin() + 1, raw=True) + else: + series = series.rolling(self.N, min_periods=1).apply( + lambda x: x.argmin() + 1, + raw=True, + ) + return series + + +class Quantile(Rolling): + """Rolling Quantile + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling quantile + """ + + def __init__(self, feature, N, qscore): + super(Quantile, self).__init__(feature, N, "quantile") + self.qscore = qscore + + def __str__(self): + return "{}({},{},{})".format(type(self).__name__, self.feature, self.N, self.qscore) + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = series.expanding(min_periods=1).quantile(self.qscore) + else: + series = series.rolling(self.N, min_periods=1).quantile(self.qscore) + return series + + +class Med(Rolling): + """Rolling Median + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling median + """ + + def __init__(self, feature, N): + super(Med, self).__init__(feature, N, "median") + + +class Mad(Rolling): + """Rolling Mean Absolute Deviation + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling mean absolute deviation + """ + + def __init__(self, feature, N): + super(Mad, self).__init__(feature, N, "mad") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + # TODO: implement in Cython + + def mad(x): + x1 = x[~np.isnan(x)] + return np.mean(np.abs(x1 - x1.mean())) + + if self.N == 0: + series = series.expanding(min_periods=1).apply(mad, raw=True) + else: + series = series.rolling(self.N, min_periods=1).apply(mad, raw=True) + return series + + +class Rank(Rolling): + """Rolling Rank (Percentile) + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling rank + """ + + def __init__(self, feature, N): + super(Rank, self).__init__(feature, N, "rank") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + # TODO: implement in Cython + + def rank(x): + if np.isnan(x[-1]): + return np.nan + x1 = x[~np.isnan(x)] + if x1.shape[0] == 0: + return np.nan + return (x1.argsort()[-1] + 1) / len(x1) + + if self.N == 0: + series = series.expanding(min_periods=1).apply(rank, raw=True) + else: + series = series.rolling(self.N, min_periods=1).apply(rank, raw=True) + return series + + +class Count(Rolling): + """Rolling Count + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling count of number of non-NaN elements + """ + + def __init__(self, feature, N): + super(Count, self).__init__(feature, N, "count") + + +class Delta(Rolling): + """Rolling Delta + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with end minus start in rolling window + """ + + def __init__(self, feature, N): + super(Delta, self).__init__(feature, N, "delta") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = series - series.iloc[0] + else: + series = series - series.shift(self.N) + return series + + +# TODO: +# support pair-wise rolling like `Slope(A, B, N)` +class Slope(Rolling): + """Rolling Slope + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with regression slope of given window + """ + + def __init__(self, feature, N): + super(Slope, self).__init__(feature, N, "slope") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = pd.Series(expanding_slope(series.values), index=series.index) + else: + series = pd.Series(rolling_slope(series.values, self.N), index=series.index) + return series + + +class Rsquare(Rolling): + """Rolling R-value Square + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with regression r-value square of given window + """ + + def __init__(self, feature, N): + super(Rsquare, self).__init__(feature, N, "rsquare") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = pd.Series(expanding_rsquare(series.values), index=series.index) + else: + series = pd.Series(rolling_rsquare(series.values, self.N), index=series.index) + return series + + +class Resi(Rolling): + """Rolling Regression Residuals + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with regression residuals of given window + """ + + def __init__(self, feature, N): + super(Resi, self).__init__(feature, N, "resi") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = pd.Series(expanding_resi(series.values), index=series.index) + else: + series = pd.Series(rolling_resi(series.values, self.N), index=series.index) + return series + + +class WMA(Rolling): + """Rolling WMA + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with weighted moving average output + """ + + def __init__(self, feature, N): + super(WMA, self).__init__(feature, N, "wma") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + # TODO: implement in Cython + + def weighted_mean(x): + w = np.arange(len(x)) + w /= w.sum() + return np.nanmean(w * x) + + if self.N == 0: + series = series.expanding(min_periods=1).apply(weighted_mean, raw=True) + else: + series = series.rolling(self.N, min_periods=1).apply(weighted_mean, raw=True) + return series + + +class EMA(Rolling): + """Rolling Exponential Mean (EMA) + + Parameters + ---------- + feature : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with regression r-value square of given window + """ + + def __init__(self, feature, N): + super(EMA, self).__init__(feature, N, "ema") + + def _load_internal(self, instrument, start_index, end_index, freq): + series = self.feature.load(instrument, start_index, end_index, freq) + + def exp_weighted_mean(x): + a = 1 - 2 / (1 + len(x)) + w = a ** np.arange(len(x))[::-1] + w /= w.sum() + return np.nansum(w * x) + + if self.N == 0: + series = series.expanding(min_periods=1).apply(exp_weighted_mean, raw=True) + else: + series = series.ewm(span=self.N, min_periods=1).mean() + return series + + +#################### Pair-Wise Rolling #################### +class PairRolling(ExpressionOps): + """Pair Rolling Operator + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling output of two input features + """ + + def __init__(self, feature_left, feature_right, N, func): + self.feature_left = feature_left + self.feature_right = feature_right + self.N = N + self.func = func + + def __str__(self): + return "{}({},{},{})".format(type(self).__name__, self.feature_left, self.feature_right, self.N) + + def _load_internal(self, instrument, start_index, end_index, freq): + series_left = self.feature_left.load(instrument, start_index, end_index, freq) + series_right = self.feature_right.load(instrument, start_index, end_index, freq) + if self.N == 0: + series = getattr(series_left.expanding(min_periods=1), self.func)(series_right) + else: + series = getattr(series_left.rolling(self.N, min_periods=1), self.func)(series_right) + return series + + def get_longest_back_rolling(self): + if self.N == 0: + return np.inf + return ( + max( + self.feature_left.get_longest_back_rolling(), + self.feature_right.get_longest_back_rolling(), + ) + + self.N + - 1 + ) + + def get_extended_window_size(self): + if self.N == 0: + get_module_logger(self.__class__.__name__).warning( + "The PairRolling(ATTR, 0) will not be accurately calculated" + ) + return self.feature.get_extended_window_size() + else: + ll, lr = self.feature_left.get_extended_window_size() + rl, rr = self.feature_right.get_extended_window_size() + return max(ll, rl) + self.N - 1, max(lr, rr) + + +class Corr(PairRolling): + """Rolling Correlation + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling correlation of two input features + """ + + def __init__(self, feature_left, feature_right, N): + super(Corr, self).__init__(feature_left, feature_right, N, "corr") + + +class Cov(PairRolling): + """Rolling Covariance + + Parameters + ---------- + feature_left : Expression + feature instance + feature_right : Expression + feature instance + N : int + rolling window size + + Returns + ---------- + Expression + a feature instance with rolling max of two input features + """ + + def __init__(self, feature_left, feature_right, N): + super(Cov, self).__init__(feature_left, feature_right, N, "cov") diff --git a/qlib/log.py b/qlib/log.py new file mode 100644 index 000000000..bc87fc579 --- /dev/null +++ b/qlib/log.py @@ -0,0 +1,112 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import os +import re +import logging +from time import time +import logging.handlers +from logging import config as logging_config + +from .config import C + + +def get_module_logger(module_name, level=None): + """ + Get a logger for a specific module. + + :param module_name: str + Logic module name. + :param level: int + :param sh_level: int + Stream handler log level. + :param log_format: str + :return: Logger + Logger object. + """ + if level is None: + level = C.logging_level + + module_name = "qlib.{}".format(module_name) + # Get logger. + module_logger = logging.getLogger(module_name) + module_logger.setLevel(level) + return module_logger + + +class TimeInspector(object): + + timer_logger = get_module_logger("timer", level=logging.WARNING) + + time_marks = [] + + @classmethod + def set_time_mark(cls): + """ + Set a time mark with current time, and this time mark will push into a stack. + :return: float + A timestamp for current time. + """ + _time = time() + cls.time_marks.append(_time) + return _time + + @classmethod + def pop_time_mark(cls): + """ + Pop last time mark from stack. + """ + return cls.time_marks.pop() + + @classmethod + def get_cost_time(cls): + """ + Get last time mark from stack, calculate time diff with current time. + :return: float + Time diff calculated by last time mark with current time. + """ + cost_time = time() - cls.time_marks.pop() + return cost_time + + @classmethod + def log_cost_time(cls, info="Done"): + """ + Get last time mark from stack, calculate time diff with current time, and log time diff and info. + :param info: str + Info that will be log into stdout. + """ + cost_time = time() - cls.time_marks.pop() + cls.timer_logger.info("Time cost: {0:.5f} | {1}".format(cost_time, info)) + + +def set_log_with_config(log_config: dict): + """set log with config + + :param log_config: + :return: + """ + logging_config.dictConfig(log_config) + + +class LogFilter(logging.Filter): + def __init__(self, param=None): + self.param = param + + @staticmethod + def match_msg(filter_str, msg): + match = False + try: + if re.match(filter_str, msg): + match = True + except Exception: + pass + return match + + def filter(self, record): + allow = True + if isinstance(self.param, str): + allow = not self.match_msg(self.param, record.msg) + elif isinstance(self.param, list): + allow = not any([self.match_msg(p, record.msg) for p in self.param]) + return allow diff --git a/qlib/utils.py b/qlib/utils.py new file mode 100644 index 000000000..cf647ce48 --- /dev/null +++ b/qlib/utils.py @@ -0,0 +1,547 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from __future__ import division +from __future__ import print_function + +import os +import re +import copy +import json +import yaml +import redis +import bisect +import shutil +import difflib +import hashlib +import datetime +import requests +import tempfile +import importlib +import contextlib +import numpy as np +import pandas as pd +from pathlib import Path + +from .config import C +from .log import get_module_logger + +log = get_module_logger("utils") + + +#################### Server #################### +def get_redis_connection(): + """get redis connection instance.""" + return redis.StrictRedis(host=C.redis_host, port=C.redis_port, db=C.redis_task_db) + + +#################### Data #################### +def read_bin(file_path, start_index, end_index): + with open(file_path, "rb") as f: + # read start_index + ref_start_index = int(np.frombuffer(f.read(4), dtype=" end_index: + return pd.Series() + # calculate offset + f.seek(4 * (si - ref_start_index) + 4) + # read nbytes + count = end_index - si + 1 + data = np.frombuffer(f.read(4 * count), dtype="= data[mid][level]: + left = mid + 1 + else: + right = mid + return left + + +#################### HTTP #################### +def requests_with_retry(url, retry=5, **kwargs): + while retry > 0: + retry -= 1 + try: + res = requests.get(url, timeout=1, **kwargs) + assert res.status_code in {200, 206} + return res + except AssertionError: + continue + except Exception as e: + log.warning("exception encountered {}".format(e)) + continue + raise Exception("ERROR: requests failed!") + + +#################### Parse #################### +def parse_config(config): + # Check whether need parse, all object except str do not need to be parsed + if not isinstance(config, str): + return config + # Check whether config is file + if os.path.exists(config): + with open(config, "r") as f: + return yaml.load(f) + # Check whether the str can be parsed + try: + return yaml.load(config) + except BaseException: + raise ValueError("cannot parse config!") + + +#################### Other #################### +def drop_nan_by_y_index(x, y, weight=None): + # x, y, weight: DataFrame + # Find index of rows which do not contain Nan in all columns from y. + mask = ~y.isna().any(axis=1) + # Get related rows from x, y, weight. + x = x[mask] + y = y[mask] + if weight is not None: + weight = weight[mask] + return x, y, weight + + +def hash_args(*args): + # json.dumps will keep the dict keys always sorted. + string = json.dumps(args, sort_keys=True, default=str) # frozenset + return hashlib.md5(string.encode()).hexdigest() + + +def parse_field(field): + # Following patterns will be matched: + # - $close -> Feature("close") + # - $close5 -> Feature("close5") + # - $open+$close -> Feature("open")+Feature("close") + if not isinstance(field, str): + field = str(field) + return re.sub(r"\$(\w+)", r'Feature("\1")', field) + + +def get_module_by_module_path(module_path): + """Load module path + + :param module_path: + :return: + """ + + if module_path.endswith(".py"): + module_spec = importlib.util.spec_from_file_location("", module_path) + module = importlib.util.module_from_spec(module_spec) + module_spec.loader.exec_module(module) + else: + module = importlib.import_module(module_path) + + return module + + +def compare_dict_value(src_data: dict, dst_data: dict): + """Compare dict value + + :param src_data: + :param dst_data: + :return: + """ + + class DateEncoder(json.JSONEncoder): + # FIXME: This class can only be accurate to the day. If it is a minute, + # there may be a bug + def default(self, o): + if isinstance(o, (datetime.datetime, datetime.date)): + return o.strftime("%Y-%m-%d %H:%M:%S") + return json.JSONEncoder.default(self, o) + + src_data = json.dumps(src_data, indent=4, sort_keys=True, cls=DateEncoder) + dst_data = json.dumps(dst_data, indent=4, sort_keys=True, cls=DateEncoder) + diff = difflib.ndiff(src_data, dst_data) + changes = [line for line in diff if line.startswith("+ ") or line.startswith("- ")] + return changes + + +def create_save_path(save_path=None): + """Create save path + + :param save_path: + :return: + """ + if save_path: + if not os.path.exists(save_path): + os.makedirs(save_path) + else: + temp_dir = os.path.expanduser("~/tmp") + if not os.path.exists(temp_dir): + os.makedirs(temp_dir) + _, save_path = tempfile.mkstemp(dir=temp_dir) + return save_path + + +@contextlib.contextmanager +def save_multiple_parts_file(filename, format="gztar"): + """Save multiple parts file + + Implementation process: + 1. get the absolute path to 'filename' + 2. create a 'filename' directory + 3. user does something with file_path('filename/') + 4. remove 'filename' directory + 5. make_archive 'filename' directory, and rename 'archive file' to filename + + :param filename: result model path + :param format: archive format: one of "zip", "tar", "gztar", "bztar", or "xztar" + :return: real model path + + Usage:: + + >>> # The following code will create an archive file('~/tmp/test_file') containing 'test_doc_i'(i is 0-10) files. + >>> with save_multiple_parts_file('~/tmp/test_file') as filename_dir: + ... for i in range(10): + ... temp_path = os.path.join(filename_dir, 'test_doc_{}'.format(str(i))) + ... with open(temp_path) as fp: + ... fp.write(str(i)) + ... + + """ + + if filename.startswith("~"): + filename = os.path.expanduser(filename) + + file_path = os.path.abspath(filename) + + # Create model dir + if os.path.exists(file_path): + raise FileExistsError("ERROR: file exists: {}, cannot be create the directory.".format(file_path)) + + os.makedirs(file_path) + + # return model dir + yield file_path + + # filename dir to filename.tar.gz file + tar_file = shutil.make_archive(file_path, format=format, root_dir=file_path) + + # Remove filename dir + if os.path.exists(file_path): + shutil.rmtree(file_path) + + # filename.tar.gz rename to filename + os.rename(tar_file, file_path) + + +@contextlib.contextmanager +def unpack_archive_with_buffer(buffer, format="gztar"): + """Unpack archive with archive buffer + After the call is finished, the archive file and directory will be deleted. + + Implementation process: + 1. create 'tempfile' in '~/tmp/' and directory + 2. 'buffer' write to 'tempfile' + 3. unpack archive file('tempfile') + 4. user does something with file_path('tempfile/') + 5. remove 'tempfile' and 'tempfile directory' + + :param buffer: bytes + :param format: archive format: one of "zip", "tar", "gztar", "bztar", or "xztar" + :return: unpack archive directory path + + Usage:: + + >>> # The following code is to print all the file names in 'test_unpack.tar.gz' + >>> with open('test_unpack.tar.gz') as fp: + ... buffer = fp.read() + ... + >>> with unpack_archive_with_buffer(buffer) as temp_dir: + ... for f_n in os.listdir(temp_dir): + ... print(f_n) + ... + + """ + temp_dir = os.path.expanduser("~/tmp") + if not os.path.exists(temp_dir): + os.makedirs(temp_dir) + with tempfile.NamedTemporaryFile("wb", delete=False, dir=temp_dir) as fp: + fp.write(buffer) + file_path = fp.name + + try: + tar_file = file_path + ".tar.gz" + os.rename(file_path, tar_file) + # Create dir + os.makedirs(file_path) + shutil.unpack_archive(tar_file, format=format, extract_dir=file_path) + + # Return temp dir + yield file_path + + except Exception as e: + log.error(str(e)) + finally: + # Remove temp tar file + if os.path.exists(tar_file): + os.unlink(tar_file) + + # Remove temp model dir + if os.path.exists(file_path): + shutil.rmtree(file_path) + + +@contextlib.contextmanager +def get_tmp_file_with_buffer(buffer): + temp_dir = os.path.expanduser("~/tmp") + if not os.path.exists(temp_dir): + os.makedirs(temp_dir) + with tempfile.NamedTemporaryFile("wb", delete=True, dir=temp_dir) as fp: + fp.write(buffer) + file_path = fp.name + yield file_path + + +def remove_repeat_field(fields): + """remove repeat field + + :param fields: list; features fields + :return: list + """ + fields = copy.deepcopy(fields) + _fields = set(fields) + return sorted(_fields, key=fields.index) + + +def remove_fields_space(fields: [list, str, tuple]): + """remove fields space + + :param fields: features fields + :return: list or str + """ + if isinstance(fields, str): + return fields.replace(" ", "") + return [i.replace(" ", "") for i in fields if isinstance(i, str)] + + +def normalize_cache_fields(fields: [list, tuple]): + """normalize cache fields + + :param fields: features fields + :return: list + """ + return sorted(remove_repeat_field(remove_fields_space(fields))) + + +def normalize_cache_instruments(instruments): + """normalize cache instruments + + :return: list or dict + """ + if isinstance(instruments, (list, tuple, pd.Index, np.ndarray)): + instruments = sorted(list(instruments)) + else: + # dict type stockpool + if "market" in instruments: + pass + else: + instruments = {k: sorted(v) for k, v in instruments.items()} + return instruments + + +def is_tradable_date(cur_date): + """judgy whether date is a tradable date + ---------- + date : pandas.Timestamp + current date + """ + from .data import D + + return str(cur_date.date()) == str(D.calendar(start_time=cur_date, future=True)[0].date()) + + +def get_date_range(trading_date, shift, future=False): + """get trading date range by shift + + :param trading_date: + :param shift: int + :param future: bool + :return: + """ + from .data import D + + calendar = D.calendar(future=future) + if pd.to_datetime(trading_date) not in list(calendar): + raise ValueError("{} is not trading day!".format(str(trading_date))) + day_index = bisect.bisect_left(calendar, trading_date) + if 0 <= (day_index + shift) < len(calendar): + if shift > 0: + return calendar[day_index + 1 : day_index + 1 + shift] + else: + return calendar[day_index + shift : day_index] + else: + return calendar + + +def get_date_by_shift(trading_date, shift, future=False): + """get trading date with shift bias wil cur_date + e.g. : shift == 1, return next trading date + shift == -1, return previous trading date + ---------- + trading_date : pandas.Timestamp + current date + shift : int + """ + return get_date_range(trading_date, shift, future)[0 if shift < 0 else -1] if shift != 0 else trading_date + + +def get_next_trading_date(trading_date, future=False): + """get next trading date + ---------- + cur_date : pandas.Timestamp + current date + """ + return get_date_by_shift(trading_date, 1, future=future) + + +def get_pre_trading_date(trading_date, future=False): + """get previous trading date + ---------- + date : pandas.Timestamp + current date + """ + return get_date_by_shift(trading_date, -1, future=future) + + +def transform_end_date(end_date=None, freq="day"): + """get previous trading date + If end_date is -1, None, or end_date is greater than the maximum trading day, the last trading date is returned. + Otherwise, returns the end_date + ---------- + end_date: str + end trading date + date : pandas.Timestamp + current date + """ + from .data import D + + last_date = D.calendar(freq=freq)[-1] + if end_date is None or (str(end_date) == "-1") or (pd.Timestamp(last_date) < pd.Timestamp(end_date)): + log.warning( + "\nInfo: the end_date in the configuration file is {}, " + "so the default last date {} is used.".format(end_date, last_date) + ) + end_date = last_date + return end_date + + +def get_date_in_file_name(file_name): + """Get the date(YYYY-MM-DD) written in file name + Parameter + file_name : str + :return + date : str + 'YYYY-MM-DD' + """ + pattern = "[0-9]{4}-[0-9]{2}-[0-9]{2}" + date = re.search(pattern, str(file_name)).group() + return date + + +def split_pred(pred, number=None, split_date=None): + """split the score file into two part + Parameter + --------- + pred : pd.DataFrame (index:) + A score file of stocks + number: the number of dates for pred_left + split_date: the last date of the pred_left + Return + ------- + pred_left : pd.DataFrame (index:) + The first part of original score file + pred_right : pd.DataFrame (index:) + The second part of original score file + """ + if number is None and split_date is None: + raise ValueError("`number` and `split date` cannot both be None") + dates = sorted(pred.index.get_level_values("datetime").unique()) + dates = list(map(pd.Timestamp, dates)) + if split_date is None: + date_left_end = dates[number - 1] + date_right_begin = dates[number] + date_left_start = None + else: + split_date = pd.Timestamp(split_date) + date_left_end = split_date + date_right_begin = split_date + pd.Timedelta(days=1) + if number is None: + date_left_start = None + else: + end_idx = bisect.bisect_right(dates, split_date) + date_left_start = dates[end_idx - number] + pred_temp = pred.sort_index() + pred_left = pred_temp.loc(axis=0)[:, date_left_start:date_left_end] + pred_right = pred_temp.loc(axis=0)[:, date_right_begin:] + return pred_left, pred_right + + +def can_use_cache(): + res = True + r = get_redis_connection() + try: + r.client() + except redis.exceptions.ConnectionError: + res = False + finally: + r.close() + return res + + +def exists_qlib_data(qlib_dir): + qlib_dir = Path(qlib_dir).expanduser() + if not qlib_dir.exists(): + return False + + calendars_dir = qlib_dir.joinpath("calendars") + instruments_dir = qlib_dir.joinpath("instruments") + features_dir = qlib_dir.joinpath("features") + # check dir + for _dir in [calendars_dir, instruments_dir, features_dir]: + if not (_dir.exists() and list(_dir.iterdir())): + return False + # check calendar bin + for _calendar in calendars_dir.iterdir(): + if not list(features_dir.rglob(f"*.{_calendar.name.split('.')[0]}.bin")): + return False + + # check instruments + code_names = set(map(lambda x: x.name.lower(), features_dir.iterdir())) + _instrument = instruments_dir.joinpath("all.txt") + miss_code = set(pd.read_csv(_instrument, sep="\t", header=None).loc[:, 0].apply(str.lower)) - set(code_names) + if miss_code and any(map(lambda x: "sht" not in x, miss_code)): + return False + + return True diff --git a/qlib/version.py b/qlib/version.py new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/data_collector/csi/README.md b/scripts/data_collector/csi/README.md new file mode 100644 index 000000000..52100df81 --- /dev/null +++ b/scripts/data_collector/csi/README.md @@ -0,0 +1,14 @@ +# CSI300 History Companies Collection + +## Requirements + +```bash +pip install -r requirements.txt +``` + +## Collector Data + +```bash +python collector.py parse_instruments --qlib_dir ~/.qlib/stock_data/qlib_data +``` + diff --git a/scripts/data_collector/csi/collector.py b/scripts/data_collector/csi/collector.py new file mode 100644 index 000000000..22cef51b6 --- /dev/null +++ b/scripts/data_collector/csi/collector.py @@ -0,0 +1,213 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import re +import bisect +from io import BytesIO +from pathlib import Path + +import fire +import requests +import pandas as pd +from lxml import etree +from loguru import logger + +NEW_COMPANIES_URL = "http://www.csindex.com.cn/uploads/file/autofile/cons/000300cons.xls" + +CSI300_CHANGES_URL = "http://www.csindex.com.cn/zh-CN/search/total?key=%E5%85%B3%E4%BA%8E%E8%B0%83%E6%95%B4%E6%B2%AA%E6%B7%B1300%E5%92%8C%E4%B8%AD%E8%AF%81%E9%A6%99%E6%B8%AF100%E7%AD%89%E6%8C%87%E6%95%B0%E6%A0%B7%E6%9C%AC%E8%82%A1%E7%9A%84%E5%85%AC%E5%91%8A" + +CSI300_BENCH_URL = "http://push2his.eastmoney.com/api/qt/stock/kline/get?secid=1.000300&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58&klt=101&fqt=0&beg=19900101&end=20220101" + +CSI300_START_DATE = pd.Timestamp("2005-01-01") + +CUR_DIR = Path(__file__).resolve().parent + + +class CSI300: + + REMOVE = "remove" + ADD = "add" + + def __init__(self, qlib_dir=None): + """ + + Parameters + ---------- + qlib_dir: str + qlib data dir, default "Path(__file__).parent/qlib_data" + """ + + if qlib_dir is None: + qlib_dir = CUR_DIR.joinpath("qlib_data") + self.instruments_dir = Path(qlib_dir).expanduser().resolve().joinpath("instruments") + self.instruments_dir.mkdir(exist_ok=True, parents=True) + self._calendar_list = None + + @property + def calendar_list(self) -> list: + """get history trading date + + Returns + ------- + """ + # TODO: get calendar from MSN + if self._calendar_list is None: + logger.info("get all trading date") + value_list = requests.get(CSI300_BENCH_URL).json()["data"]["klines"] + self._calendar_list = sorted(map(lambda x: pd.Timestamp(x.split(",")[0]), value_list)) + return self._calendar_list + + def _get_trading_date_by_shift(self, trading_date: pd.Timestamp, shift=1): + """get trading date by shift + + Parameters + ---------- + shift : int + shift, default is 1 + + trading_date : pd.Timestamp + trading date + Returns + ------- + + """ + left_index = bisect.bisect_left(self.calendar_list, trading_date) + try: + res = self.calendar_list[left_index + shift] + except IndexError: + res = trading_date + return res + + def _get_changes(self) -> pd.DataFrame: + """get companies changes + + Returns + ------- + + """ + logger.info("get companies changes......") + res = [] + for _url in self._get_change_notices_url(): + _df = self._read_change_from_url(_url) + res.append(_df) + logger.info("get companies changes finish") + return pd.concat(res) + + @staticmethod + def normalize_symbol(symbol): + symbol = f"{int(symbol):06}" + return f"SH{symbol}" if symbol.startswith("60") else f"SZ{symbol}" + + def _read_change_from_url(self, url: str) -> pd.DataFrame: + """read change from url + + Parameters + ---------- + url : str + change url + + Returns + ------- + + """ + resp = requests.get(url) + _text = resp.text + + date_list = re.findall(r"(\d{4}).*?年.*?(\d+).*?月.*?(\d+).*?日", _text) + if len(date_list) >= 2: + add_date = pd.Timestamp("-".join(date_list[0])) + else: + _date = pd.Timestamp("-".join(re.findall(r"(\d{4}).*?年.*?(\d+).*?月", _text)[0])) + add_date = self._get_trading_date_by_shift(_date, shift=0) + remove_date = self._get_trading_date_by_shift(add_date, shift=-1) + logger.info(f"get {add_date} changes") + try: + + excel_url = re.findall('.*href="(.*?xls.*?)".*', _text)[0] + _io = BytesIO(requests.get(f"http://www.csindex.com.cn{excel_url}").content) + df_map = pd.read_excel(_io, sheet_name=None) + tmp = [] + for _s_name, _type, _date in [("调入", self.ADD, add_date), ("调出", self.REMOVE, remove_date)]: + _df = df_map[_s_name] + _df = _df.loc[_df["指数代码"] == "000300", ["证券代码"]] + _df = _df.applymap(self.normalize_symbol) + _df.columns = ["symbol"] + _df["type"] = _type + _df["date"] = _date + tmp.append(_df) + df = pd.concat(tmp) + except Exception: + df = None + for _df in pd.read_html(resp.content): + if _df.shape[-1] != 4: + continue + tmp = [] + for _s, _type, _date in [ + (_df.iloc[2:, 0], self.REMOVE, remove_date), + (_df.iloc[2:, 2], self.ADD, add_date), + ]: + _tmp_df = pd.DataFrame() + _tmp_df["symbol"] = _s.map(self.normalize_symbol) + _tmp_df["type"] = _type + _tmp_df["date"] = _date + tmp.append(_tmp_df) + df = pd.concat(tmp) + break + return df + + @staticmethod + def _get_change_notices_url() -> list: + """get change notices url + + Returns + ------- + + """ + resp = requests.get(CSI300_CHANGES_URL) + html = etree.HTML(resp.text) + return html.xpath("//*[@id='itemContainer']//li/a/@href") + + def _get_new_companies(self): + + logger.info("get new companies") + _io = BytesIO(requests.get(NEW_COMPANIES_URL).content) + df = pd.read_excel(_io) + df = df.iloc[:, [0, 4]] + df.columns = ["end_date", "symbol"] + df["symbol"] = df["symbol"].map(self.normalize_symbol) + df["end_date"] = pd.to_datetime(df["end_date"]) + df["start_date"] = CSI300_START_DATE + return df + + def parse_instruments(self): + """parse csi300.txt + + Examples + ------- + $ python collector.py parse_instruments --qlib_dir ~/.qlib/qlib_data/cn_data + """ + logger.info("start parse csi300 companies.....") + instruments_columns = ["symbol", "start_date", "end_date"] + changers_df = self._get_changes() + new_df = self._get_new_companies() + logger.info("parse history companies by changes......") + for _row in changers_df.sort_values("date", ascending=False).itertuples(index=False): + if _row.type == self.ADD: + min_end_date = new_df.loc[new_df["symbol"] == _row.symbol, "end_date"].min() + new_df.loc[ + (new_df["end_date"] == min_end_date) & (new_df["symbol"] == _row.symbol), "start_date" + ] = _row.date + else: + _tmp_df = pd.DataFrame( + [[_row.symbol, CSI300_START_DATE, _row.date]], columns=["symbol", "start_date", "end_date"] + ) + new_df = new_df.append(_tmp_df, sort=False) + + new_df.loc[:, instruments_columns].to_csv( + self.instruments_dir.joinpath("csi300.txt"), sep="\t", index=False, header=None + ) + logger.info("parse csi300 companies finished.") + + +if __name__ == "__main__": + fire.Fire(CSI300) diff --git a/scripts/data_collector/csi/requirements.txt b/scripts/data_collector/csi/requirements.txt new file mode 100644 index 000000000..729271038 --- /dev/null +++ b/scripts/data_collector/csi/requirements.txt @@ -0,0 +1,6 @@ +logure +fire +requests +pandas +lxml +loguru diff --git a/scripts/data_collector/msn/README.md b/scripts/data_collector/msn/README.md new file mode 100644 index 000000000..c197d2b97 --- /dev/null +++ b/scripts/data_collector/msn/README.md @@ -0,0 +1 @@ +# TODO: Support collecting data from MSN \ No newline at end of file diff --git a/scripts/data_collector/yahoo/README.md b/scripts/data_collector/yahoo/README.md new file mode 100644 index 000000000..958d74854 --- /dev/null +++ b/scripts/data_collector/yahoo/README.md @@ -0,0 +1,38 @@ +# Collect Data From Yahoo Finance + +## Requirements + +```bash +pip install -r requirements.txt +``` + +## Collector Data + +### Download data -> Normalize data -> Dump data +```bash +python collector.py collector_data --source_dir ~/.qlib/stock_data/source --normalize_dir ~/.qlib/stock_data/normalize_dir --qlib_dir ~/.qlib/stock_data/qlib_data +``` + +### Download Data From Yahoo Finance + +```bash +python collector.py download_data --source_dir ~/.qlib/stock_data/source +``` + +### Normalize Yahoo Finance Data + +```bash +python collector.py normalize_data --source_dir ~/.qlib/stock_data/source --normalize_dir ~/.qlib/stock_data/normalize +``` + +### Manual Ajust Yahoo Finance Data + +```bash +python collector.py manual_adj_data --normalize_dir ~/.qlib/stock_data/normalize +``` + +### Dump Yahoo Finance Data + +```bash +python collector.py dump_data --normalize_dir ~/.qlib/stock_data/normalize_dir --qlib_dir ~/.qlib/stock_data/qlib_data +``` \ No newline at end of file diff --git a/scripts/data_collector/yahoo/collector.py b/scripts/data_collector/yahoo/collector.py new file mode 100644 index 000000000..bfa095c58 --- /dev/null +++ b/scripts/data_collector/yahoo/collector.py @@ -0,0 +1,254 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import re +import sys +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor, as_completed + +import fire +import requests +import numpy as np +import pandas as pd +from tqdm import tqdm +from lxml import etree +from loguru import logger +from yahooquery import Ticker + +CUR_DIR = Path(__file__).resolve().parent +sys.path.append(str(CUR_DIR.parent.parent)) +from dump_bin import DumpData + +SYMBOLS_URL = "http://app.finance.ifeng.com/hq/list.php?type=stock_a&class={s_type}" +CSI300_BENCH_URL = "http://push2his.eastmoney.com/api/qt/stock/kline/get?secid=1.000300&fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58&klt=101&fqt=0&beg=19900101&end=20220101" + + +class YahooCollector: + def __init__(self, save_dir: [str, Path], max_workers=4): + + self.save_dir = Path(save_dir).expanduser().resolve() + self.save_dir.mkdir(parents=True, exist_ok=True) + self._stock_list = None + self.max_workers = max_workers + + @property + def stock_list(self): + if self._stock_list is None: + self._stock_list = self.get_stock_list() + return self._stock_list + + @staticmethod + def get_stock_list() -> list: + _res = set() + for _k, _v in (("ha", "ss"), ("sa", "sz"), ("gem", "sz")): + resp = requests.get(SYMBOLS_URL.format(s_type=_k)) + _res |= set( + map( + lambda x: "{}.{}".format(re.findall(r"\d+", x)[0], _v), + etree.HTML(resp.text).xpath("//div[@class='result']/ul//li/a/text()"), + ) + ) + return sorted(list(_res)) + + def save_stock(self, symbol, df: pd.DataFrame): + """save stock data to file + + Parameters + ---------- + symbol: str + stock code + df : pd.DataFrame + df.columns must contain "symbol" and "datetime" + """ + if df.empty: + raise ValueError("df is empty") + + symbol_s = symbol.split(".") + symbol = f"sh{symbol_s[0]}" if symbol_s[-1] == "ss" else f"sz{symbol_s[0]}" + stock_path = self.save_dir.joinpath(f"{symbol}.csv") + df["symbol"] = symbol + df.to_csv(stock_path, index=False) + + def collector_data(self): + """collector data + + """ + logger.info("start collector yahoo data......") + error_symbol = [] + with ThreadPoolExecutor(max_workers=self.max_workers) as worker: + futures = {} + p_bar = tqdm(total=len(self.stock_list)) + for symbols in [ + self.stock_list[i : i + self.max_workers] for i in range(0, len(self.stock_list), self.max_workers) + ]: + resp = Ticker(symbols, asynchronous=True, max_workers=self.max_workers).history(period="max") + if isinstance(resp, dict): + for symbol, df in resp.items(): + if isinstance(df, pd.DataFrame): + futures[ + worker.submit( + self.save_stock, symbol, df.reset_index().rename(columns={"index": "date"}) + ) + ] = symbol + else: + error_symbol.append(symbol) + else: + for symbol, df in resp.reset_index().groupby("symbol"): + futures[worker.submit(self.save_stock, symbol, df)] = symbol + p_bar.update(self.max_workers) + p_bar.close() + + with tqdm(total=len(futures.values())) as p_bar: + for future in as_completed(futures): + try: + future.result() + except Exception as e: + logger.error(e) + error_symbol.append(futures[future]) + p_bar.update() + + logger.info(error_symbol) + logger.info(len(error_symbol)) + logger.info(len(self.stock_list)) + + # TODO: from MSN + df = pd.DataFrame(map(lambda x: x.split(","), requests.get(CSI300_BENCH_URL).json()["data"]["klines"])) + df.columns = ["date", "open", "close", "high", "low", "volume", "money", "change"] + df["date"] = pd.to_datetime(df["date"]) + df = df.astype(float, errors="ignore") + df["adjclose"] = df["close"] + df.to_csv(self.save_dir.joinpath("sh000300.csv"), index=False) + + +class Run: + def __init__(self, source_dir=None, normalize_dir=None, qlib_dir=None, max_workers=4): + """ + + Parameters + ---------- + source_dir: str + The directory where the raw data collected from the Internet is saved, default "Path(__file__).parent/source" + normalize_dir: str + Directory for normalize data, default "Path(__file__).parent/normalize" + qlib_dir: str + qlib data dir; usage of provider_uri, default "Path(__file__).parent/qlib_data" + max_workers: int + Concurrent number, default is 4 + """ + if source_dir is None: + source_dir = CUR_DIR.joinpath("source") + self.source_dir = Path(source_dir).expanduser().resolve() + self.source_dir.mkdir(parents=True, exist_ok=True) + + if normalize_dir is None: + normalize_dir = CUR_DIR.joinpath("normalize") + self.normalize_dir = Path(normalize_dir).expanduser().resolve() + self.normalize_dir.mkdir(parents=True, exist_ok=True) + + if qlib_dir is None: + qlib_dir = CUR_DIR.joinpath("qlib_data") + self.qlib_dir = Path(qlib_dir).expanduser().resolve() + self.qlib_dir.mkdir(parents=True, exist_ok=True) + + self.max_workers = max_workers + + def normalize_data(self): + """normalize data + + Examples + --------- + $ python collector.py normalize_data --source_dir ~/.qlib/stock_data/source --normalize_dir ~/.qlib/stock_data/normalize + + """ + + def _normalize(file_path: Path): + columns = ["open", "close", "high", "low", "volume"] + df = pd.read_csv(file_path) + df.sort_values("date", inplace=True) + df.loc[df["volume"] <= 0, set(df.columns) - {"symbol", "date"}] = np.nan + df["factor"] = df["adjclose"] / df["close"] + for _col in columns: + if _col == "volume": + df[_col] = df[_col] / df["factor"] + else: + df[_col] = df[_col] * df["factor"] + _tmp_series = df["close"].fillna(method="ffill") + df["change"] = _tmp_series / _tmp_series.shift(1) - 1 + columns += ["change", "factor"] + df.loc[(df["volume"] <= 0) | np.isnan(df["volume"]), columns] = np.nan + df.loc[:, columns + ["date"]].to_csv(self.normalize_dir.joinpath(file_path.name), index=False) + + with ThreadPoolExecutor(max_workers=self.max_workers) as worker: + file_list = list(self.source_dir.glob("*.csv")) + with tqdm(total=len(file_list)) as p_bar: + for _ in worker.map(_normalize, file_list): + p_bar.update() + + def manual_adj_data(self): + """manual adjust data + + Examples + -------- + $ python collector.py manual_adj_data --normalize_dir ~/.qlib/stock_data/normalize + + """ + def _adj(file_path: Path): + df = pd.read_csv(file_path) + df = df.loc[:, ["open", "close", "high", "low", "volume", "change", "factor"]] + df.sort_values("date", inplace=True) + df = df.set_index("date") + df = df.loc[df.first_valid_index():] + _close = df["close"].iloc[0] + for _col in df.columns: + if _col == "volume": + df[_col] = df[_col] * _close + elif _col != "change": + df[_col] = df[_col] / _close + else: + pass + df.reset_index().to_csv(self.normalize_dir.joinpath(file_path.name), index=False) + + with ThreadPoolExecutor(max_workers=self.max_workers) as worker: + file_list = list(self.normalize_dir.glob("*.csv")) + with tqdm(total=len(file_list)) as p_bar: + for _ in worker.map(_adj, file_list): + p_bar.update() + + + def dump_data(self): + """dump yahoo data + + Examples + --------- + $ python collector.py dump_data --normalize_dir ~/.qlib/stock_data/normalize_dir --qlib_dir ~/.qlib/stock_data/qlib_data + + """ + DumpData(csv_path=self.normalize_dir, qlib_dir=self.qlib_dir, works=self.max_workers).dump( + include_fields="close,open,high,low,volume,change,factor" + ) + + def download_data(self): + """download data from Internet + + Examples + --------- + $ python collector.py download_data --source_dir ~/.qlib/stock_data/source + + """ + YahooCollector(self.source_dir, max_workers=self.max_workers).collector_data() + + def collector_data(self): + """download -> normalize -> dump data + + Examples + ------- + $ python collector.py collector_data --source_dir ~/.qlib/stock_data/source --normalize_dir ~/.qlib/stock_data/normalize_dir --qlib_dir ~/.qlib/stock_data/qlib_data + """ + self.download_data() + self.normalize_data() + self.manual_adj_data() + self.dump_data() + + +if __name__ == "__main__": + fire.Fire(Run) diff --git a/scripts/data_collector/yahoo/requirements.txt b/scripts/data_collector/yahoo/requirements.txt new file mode 100644 index 000000000..474e8cfd8 --- /dev/null +++ b/scripts/data_collector/yahoo/requirements.txt @@ -0,0 +1,9 @@ +logure +fire +requests +numpy +pandas +tqdm +lxml +loguru +yahooquery diff --git a/scripts/dump_bin.py b/scripts/dump_bin.py new file mode 100644 index 000000000..d972f6318 --- /dev/null +++ b/scripts/dump_bin.py @@ -0,0 +1,250 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import shutil +from pathlib import Path +from functools import partial +from concurrent.futures import ThreadPoolExecutor + +import fire +import numpy as np +import pandas as pd +from tqdm import tqdm +from loguru import logger + + +class DumpData(object): + FILE_SUFFIX = ".csv" + + def __init__( + self, + csv_path: str, + qlib_dir: str, + backup_dir: str = None, + freq: str = "day", + works: int = None, + date_field_name: str = "date", + ): + """ + + Parameters + ---------- + csv_path: str + stock data path or directory + qlib_dir: str + qlib(dump) data director + backup_dir: str, default None + if backup_dir is not None, backup qlib_dir to backup_dir + freq: str, default "day" + transaction frequency + works: int, default None + number of threads + date_field_name: str, default "date" + the name of the date field in the csv + """ + csv_path = Path(csv_path).expanduser() + self.csv_files = sorted(csv_path.glob(f"*{self.FILE_SUFFIX}") if csv_path.is_dir() else [csv_path]) + self.qlib_dir = Path(qlib_dir).expanduser() + self.backup_dir = backup_dir if backup_dir is None else Path(backup_dir).expanduser() + if backup_dir is not None: + self._backup_qlib_dir(Path(backup_dir).expanduser()) + + self.freq = freq + self.calendar_format = "%Y-%m-%d" if self.freq == "day" else "%Y-%m-%d %H:%M:%S" + + self.works = works + self.date_field_name = date_field_name + + self._calendars_dir = self.qlib_dir.joinpath("calendars") + self._features_dir = self.qlib_dir.joinpath("features") + self._instruments_dir = self.qlib_dir.joinpath("instruments") + + self._calendars_list = [] + self._include_fields = () + self._exclude_fields = () + + def _backup_qlib_dir(self, target_dir: Path): + shutil.copytree(str(self.qlib_dir.resolve()), str(target_dir.resolve())) + + def _get_date_for_df(self, file_path: Path, *, is_begin_end: bool = False): + df = pd.read_csv(str(file_path.resolve())) + if df.empty or self.date_field_name not in df.columns.tolist(): + return [] + if is_begin_end: + return [df[self.date_field_name].min(), df[self.date_field_name].max()] + return df[self.date_field_name].tolist() + + def _get_source_data(self, file_path: Path): + df = pd.read_csv(str(file_path.resolve())) + df[self.date_field_name] = df[self.date_field_name].astype(np.datetime64) + return df + + def _file_to_bin(self, file_path: Path = None): + code = file_path.name[: -len(self.FILE_SUFFIX)].strip().lower() + features_dir = self._features_dir.joinpath(code) + features_dir.mkdir(parents=True, exist_ok=True) + calendars_df = pd.DataFrame(data=self._calendars_list, columns=[self.date_field_name]) + calendars_df[self.date_field_name] = calendars_df[self.date_field_name].astype(np.datetime64) + # read csv file + df = self._get_source_data(file_path) + cal_df = calendars_df[ + (calendars_df[self.date_field_name] >= df[self.date_field_name].min()) + & (calendars_df[self.date_field_name] <= df[self.date_field_name].max()) + ] + cal_df.set_index(self.date_field_name, inplace=True) + df.set_index(self.date_field_name, inplace=True) + r_df = df.reindex(cal_df.index) + date_index = self._calendars_list.index(r_df.index.min()) + for field in ( + self._include_fields + if self._include_fields + else set(r_df.columns) - set(self._exclude_fields) + if self._exclude_fields + else r_df.columns + ): + + bin_path = features_dir.joinpath(f"{field}.{self.freq}.bin") + if field not in r_df.columns: + continue + r = np.hstack([date_index, r_df[field]]).astype(" --qlib_dir + + Examples + --------- + + # dump all stock + python dump_bin.py dump_features --csv_path ~/tmp/stock_data --qlib_dir ~/tmp/qlib_data --exclude_fields date,code,timestamp,code_name + # dump one stock + python dump_bin.py dump_features --csv_path ~/tmp/stock_data/sh600000.csv --qlib_dir ~/tmp/qlib_data --calendar_path ~/tmp/qlib_data/calendar/all.txt --exclude_fields date,code,timestamp,code_name + """ + logger.info("start dump features......") + if calendar_path is not None: + # read calendar from calendar file + self._calendars_list = self._read_calendar(Path(calendar_path)) + + if not self._calendars_list: + self.dump_calendars() + + self._include_fields = tuple(map(str.strip, include_fields)) if include_fields else self._include_fields + self._exclude_fields = tuple(map(str.strip, exclude_fields)) if exclude_fields else self._exclude_fields + with tqdm(total=len(self.csv_files)) as p_bar: + with ThreadPoolExecutor(max_workers=self.works) as executor: + for _ in executor.map(self._file_to_bin, self.csv_files): + p_bar.update() + + logger.info("end of features dump.\n") + + def dump_calendars(self): + """dump calendars + + Notes + --------- + python dump_bin.py dump_calendars --csv_path --qlib_dir + + Examples + --------- + python dump_bin.py dump_calendars --csv_path ~/tmp/stock_data --qlib_dir ~/tmp/qlib_data + """ + logger.info("start dump calendars......") + calendar_path = str(self._calendars_dir.joinpath(f"{self.freq}.txt").expanduser().resolve()) + all_datetime = set() + with tqdm(total=len(self.csv_files)) as p_bar: + with ThreadPoolExecutor(max_workers=self.works) as executor: + for temp_datetime in executor.map(self._get_date_for_df, self.csv_files): + all_datetime = all_datetime | set(temp_datetime) + p_bar.update() + + self._calendars_list = sorted(map(pd.Timestamp, all_datetime)) + self._calendars_dir.mkdir(parents=True, exist_ok=True) + result_calendar_list = list(map(lambda x: x.strftime(self.calendar_format), self._calendars_list)) + np.savetxt(calendar_path, result_calendar_list, fmt="%s", encoding="utf-8") + logger.info("end of calendars dump.\n") + + def dump_instruments(self): + """dump instruments + + Notes + --------- + python dump_bin.py dump_instruments --csv_path --qlib_dir + + Examples + --------- + python dump_bin.py dump_instruments --csv_path ~/tmp/stock_data --qlib_dir ~/tmp/qlib_data + """ + logger.info("start dump instruments......") + symbol_list = list(map(lambda x: x.name[: -len(self.FILE_SUFFIX)], self.csv_files)) + _result_list = [] + _fun = partial(self._get_date_for_df, is_begin_end=True) + with tqdm(total=len(symbol_list)) as p_bar: + with ThreadPoolExecutor(max_workers=self.works) as execute: + for symbol, res in zip(symbol_list, execute.map(_fun, self.csv_files)): + if res: + begin_time = res[0] + end_time = res[-1] + _result_list.append(f"{symbol.upper()}\t{begin_time}\t{end_time}") + p_bar.update() + + self._instruments_dir.mkdir(parents=True, exist_ok=True) + to_path = str(self._instruments_dir.joinpath("all.txt").resolve()) + np.savetxt(to_path, _result_list, fmt="%s", encoding="utf-8") + logger.info("end of instruments dump.\n") + + def dump(self, include_fields: str = None, exclude_fields: tuple = None): + """dump data + + Parameters + ---------- + include_fields: str + dump fields + + exclude_fields: str + fields not dumped + + Examples + --------- + python dump_bin.py dump --csv_path ~/tmp/stock_data --qlib_dir ~/tmp/qlib_data --include_fields open,close,high,low,volume,factor + python dump_bin.py dump --csv_path ~/tmp/stock_data --qlib_dir ~/tmp/qlib_data --exclude_fields date,code,timestamp,code_name + """ + if isinstance(exclude_fields, str): + exclude_fields = exclude_fields.split(",") + if isinstance(include_fields, str): + include_fields = include_fields.split(",") + self.dump_calendars() + self.dump_features(include_fields=include_fields, exclude_fields=exclude_fields) + self.dump_instruments() + + +if __name__ == "__main__": + fire.Fire(DumpData) diff --git a/scripts/get_data.py b/scripts/get_data.py new file mode 100644 index 000000000..b6f5b64f5 --- /dev/null +++ b/scripts/get_data.py @@ -0,0 +1,91 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import fire +import zipfile +import requests +from tqdm import tqdm +from pathlib import Path +from loguru import logger + + +class GetData: + REMOTE_URL = "http://fintech.msra.cn/stock_data/downloads" + + def __init__(self, delete_zip_file=False): + """ + + Parameters + ---------- + delete_zip_file : bool, optional + Whether to delete the zip file, value from True or False, by default False + """ + self.delete_zip_file = delete_zip_file + + def _download_data(self, file_name: str, target_dir: [Path, str]): + target_dir = Path(target_dir).expanduser() + target_dir.mkdir(exist_ok=True, parents=True) + + url = f"{self.REMOTE_URL}/{file_name}" + target_path = target_dir.joinpath(file_name) + + resp = requests.get(url, stream=True) + if resp.status_code != 200: + raise requests.exceptions.HTTPError() + + chuck_size = 1024 + logger.info(f"{file_name} downloading......") + with tqdm(total=int(resp.headers.get("Content-Length", 0))) as p_bar: + with target_path.open("wb") as fp: + for chuck in resp.iter_content(chunk_size=chuck_size): + fp.write(chuck) + p_bar.update(chuck_size) + + self._unzip(target_path, target_dir) + if self.delete_zip_file: + target_path.unlike() + + @staticmethod + def _unzip(file_path: Path, target_dir: Path): + logger.info(f"{file_path} unzipping......") + with zipfile.ZipFile(str(file_path.resolve()), "r") as zp: + for _file in tqdm(zp.namelist()): + zp.extract(_file, str(target_dir.resolve())) + + def qlib_data_cn(self, target_dir="~/.qlib/qlib_data/cn_data"): + """download cn qlib data from remote + + Parameters + ---------- + target_dir: str + data save directory + + Examples + --------- + python get_data.py qlib_data_cn --target_dir ~/.qlib/qlib_data/cn_data + ------- + + """ + file_name = "qlib_data_cn.zip" + self._download_data(file_name, target_dir) + + def csv_data_cn(self, target_dir="~/.qlib/csv_data/cn_data"): + """download cn csv data from remote + + Parameters + ---------- + target_dir: str + data save directory + + Examples + --------- + python get_data.py csv_data_cn --target_dir ~/.qlib/csv_data/cn_data + ------- + + """ + file_name = "csv_data_cn.zip" + self._download_data(file_name, target_dir) + + +if __name__ == "__main__": + fire.Fire(GetData) diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..479fa8dda --- /dev/null +++ b/setup.py @@ -0,0 +1,110 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# -*- coding: utf-8 -*- +import io +import os +import numpy + +from setuptools import find_packages, setup, Extension + +# Package meta-data. +NAME = "qlib" +DESCRIPTION = "A Quantitative-research Library" +REQUIRES_PYTHON = ">=3.5.0" +VERSION = "0.4.6.dev" + +# Detect Cython +try: + import Cython + + ver = Cython.__version__ + _CYTHON_INSTALLED = ver >= "0.28" +except ImportError: + _CYTHON_INSTALLED = False + +if not _CYTHON_INSTALLED: + print("Required Cython version >= 0.28 is not detected!") + print('Please run "pip install --upgrade cython" first.') + exit(-1) + +# What packages are required for this module to be executed? +# `estimator` may depend on other packages. In order to reduce dependencies, it is not written here. +REQUIRED = [ + "numpy>=1.12.0", + "pandas>=0.25.1", + "scipy>=1.0.0", + "requests>=2.18.0", + "sacred>=0.7.4", + "pymongo==3.7.2", + "python-socketio==3.1.2", + "redis>=3.0.1", + "python-redis-lock>=3.3.1", + "schedule>=0.6.0", + "cvxpy==1.0.21", + "hyperopt==0.1.1", + "fire>=0.2.1", + "statsmodels", + "xlrd>=1.0.0", + "plotly==3.5.0", + "matplotlib==3.1.3", + "tables>=3.6.1", + "pyyaml>=5.3.1", + "tqdm", + "loguru", + "lightgbm", + "tornado", +] + +# Numpy include +NUMPY_INCLUDE = numpy.get_include() + +here = os.path.abspath(os.path.dirname(__file__)) + +long_description = "TODO: to be completed" + +# Cython Extensions +extensions = [ + Extension( + "qlib.data._libs.rolling", + ["qlib/data/_libs/rolling.pyx"], + language="c++", + include_dirs=[NUMPY_INCLUDE], + ), + Extension( + "qlib.data._libs.expanding", + ["qlib/data/_libs/expanding.pyx"], + language="c++", + include_dirs=[NUMPY_INCLUDE], + ), +] + +# Where the magic happens: +setup( + name=NAME, + version=VERSION, + description=DESCRIPTION, + long_description=long_description, + python_requires=REQUIRES_PYTHON, + packages=find_packages(exclude=("tests",)), + # if your package is a single module, use this instead of 'packages': + # py_modules=['qlib'], + entry_points={ + # 'console_scripts': ['mycli=mymodule:cli'], + "console_scripts": [ + "estimator=qlib.contrib.estimator.launcher:run", + ], + }, + ext_modules=extensions, + install_requires=REQUIRED, + include_package_data=True, + classifiers=[ + # Trove classifiers + # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers + # 'License :: OSI Approved :: MIT License', + "Development Status :: 3 - Alpha", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + ], +) diff --git a/tests/test_all_pipeline.py b/tests/test_all_pipeline.py new file mode 100644 index 000000000..643cfa496 --- /dev/null +++ b/tests/test_all_pipeline.py @@ -0,0 +1,173 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import sys +import unittest +from pathlib import Path + +import numpy as np +import pandas as pd +from scipy.stats import pearsonr + +import qlib +from qlib.config import REG_CN +from qlib.utils import drop_nan_by_y_index +from qlib.contrib.model.gbdt import LGBModel +from qlib.contrib.estimator.handler import QLibDataHandlerClose +from qlib.contrib.strategy.strategy import TopkDropoutStrategy +from qlib.contrib.evaluate import ( + backtest as normal_backtest, + risk_analysis, +) +from qlib.utils import exists_qlib_data + + +DATA_HANDLER_CONFIG = { + "dropna_label": True, + "start_date": "2008-01-01", + "end_date": "2020-08-01", + "market": "CSI300", +} + +MODEL_CONFIG = { + "loss": "mse", + "colsample_bytree": 0.8879, + "learning_rate": 0.0421, + "subsample": 0.8789, + "lambda_l1": 205.6999, + "lambda_l2": 580.9768, + "max_depth": 8, + "num_leaves": 210, + "num_threads": 20, +} + +TRAINER_CONFIG = { + "train_start_date": "2008-01-01", + "train_end_date": "2014-12-31", + "validate_start_date": "2015-01-01", + "validate_end_date": "2016-12-31", + "test_start_date": "2017-01-01", + "test_end_date": "2020-08-01", +} + +STRATEGY_CONFIG = { + "topk": 50, + "n_drop": 5, +} + +BACKTEST_CONFIG = { + "verbose": False, + "limit_threshold": 0.095, + "account": 100000000, + "benchmark": "SH000300", + "deal_price": "close", + "open_cost": 0.0005, + "close_cost": 0.0015, + "min_cost": 5, +} + + +# train +def train(): + """train model + + Returns + ------- + pred_score: pandas.DataFrame + predict scores + performance: dict + model performance + """ + # get data + x_train, y_train, x_validate, y_validate, x_test, y_test = QLibDataHandlerClose( + **DATA_HANDLER_CONFIG + ).get_split_data(**TRAINER_CONFIG) + + # train + model = LGBModel(**MODEL_CONFIG) + model.fit(x_train, y_train, x_validate, y_validate) + _pred = model.predict(x_test) + _pred = pd.DataFrame(_pred, index=x_test.index, columns=y_test.columns) + pred_score = pd.DataFrame(index=_pred.index) + pred_score["score"] = _pred.iloc(axis=1)[0] + + # get performance + model_score = model.score(x_test, y_test) + # Remove rows from x, y and w, which contain Nan in any columns in y_test. + x_test, y_test, __ = drop_nan_by_y_index(x_test, y_test) + pred_test = model.predict(x_test) + model_pearsonr = pearsonr(np.ravel(pred_test), np.ravel(y_test.values))[0] + + return pred_score, {"model_score": model_score, "model_pearsonr": model_pearsonr} + + +def backtest(pred): + """backtest + + Parameters + ---------- + pred: pandas.DataFrame + predict scores + + Returns + ------- + report_normal: pandas.DataFrame + + positions_normal: dict + + """ + strategy = TopkDropoutStrategy(**STRATEGY_CONFIG) + _report_normal, _positions_normal = normal_backtest(pred, strategy=strategy, **BACKTEST_CONFIG) + return _report_normal, _positions_normal + + +def analyze(report_normal): + _analysis = dict() + _analysis["sub_bench"] = risk_analysis(report_normal["return"] - report_normal["bench"]) + _analysis["sub_cost"] = risk_analysis(report_normal["return"] - report_normal["bench"] - report_normal["cost"]) + analysis_df = pd.concat(_analysis) # type: pd.DataFrame + print(analysis_df) + return analysis_df + + +class TestAllFlow(unittest.TestCase): + PRED_SCORE = None + REPORT_NORMAL = None + POSITIONS = None + + @classmethod + def setUpClass(cls) -> None: + # use default data + provier_uri = "~/.qlib/qlib_data/cn_data" # target_dir + if not exists_qlib_data(provier_uri): + print(f"Qlib data is not found in {provier_uri}") + sys.path.append(str(Path(__file__).resolve().parent.parent.joinpath("scripts"))) + from get_data import GetData + + GetData().qlib_data_cn(provier_uri) + qlib.init(provier_uri=provier_uri, region=REG_CN) + + def test_0_train(self): + TestAllFlow.PRED_SCORE, model_pearsonr = train() + self.assertGreaterEqual(model_pearsonr["model_pearsonr"], 0, "train failed") + + def test_1_backtest(self): + TestAllFlow.REPORT_NORMAL, TestAllFlow.POSITIONS = backtest( + TestAllFlow.PRED_SCORE + ) + analyze_df = analyze(TestAllFlow.REPORT_NORMAL) + self.assertGreaterEqual( + analyze_df.loc(axis=0)["sub_cost", "annual"].values[0], 0.10, "backtest failed", + ) + + +def suite(): + _suite = unittest.TestSuite() + _suite.addTest(TestAllFlow("test_0_train")) + _suite.addTest(TestAllFlow("test_1_backtest")) + return _suite + + +if __name__ == "__main__": + runner = unittest.TextTestRunner() + runner.run(suite()) diff --git a/tests/test_dump_data.py b/tests/test_dump_data.py new file mode 100644 index 000000000..39fb00f40 --- /dev/null +++ b/tests/test_dump_data.py @@ -0,0 +1,88 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import sys +import shutil +import unittest +from pathlib import Path + +import qlib +import numpy as np +import pandas as pd +from qlib.data import D + +sys.path.append(str(Path(__file__).resolve().parent.parent.joinpath("scripts"))) +from get_data import GetData +from dump_bin import DumpData + + +DATA_DIR = Path(__file__).parent.joinpath("test_data") +SOURCE_DIR = DATA_DIR.joinpath("source") +SOURCE_DIR.mkdir(exist_ok=True, parents=True) +QLIB_DIR = DATA_DIR.joinpath("qlib") +QLIB_DIR.mkdir(exist_ok=True, parents=True) + + +class TestDumpData(unittest.TestCase): + FIELDS = "open,close,high,low,volume,factor,change".split(",") + QLIB_FIELDS = list(map(lambda x: f"${x}", FIELDS)) + DUMP_DATA = None + STOCK_NAMES = None + + # simpe data + SIMPLE_DATA = None + + @classmethod + def setUpClass(cls) -> None: + GetData().csv_data_cn(SOURCE_DIR) + TestDumpData.DUMP_DATA = DumpData(csv_path=SOURCE_DIR, qlib_dir=QLIB_DIR) + TestDumpData.STOCK_NAMES = list(map(lambda x: x.name[:-4].upper(), SOURCE_DIR.iterdir())) + provider_uri = str(QLIB_DIR.resolve()) + qlib.init( + provider_uri=provider_uri, + expression_cache=None, + dataset_cache=None, + ) + + @classmethod + def tearDownClass(cls) -> None: + shutil.rmtree(str(DATA_DIR.resolve())) + + def test_0_dump_calendars(self): + self.DUMP_DATA.dump_calendars() + ori_calendars = set( + map( + pd.Timestamp, + pd.read_csv(QLIB_DIR.joinpath("calendars", "day.txt"), header=None).loc[:, 0].values, + ) + ) + res_calendars = set(D.calendar()) + assert len(ori_calendars - res_calendars) == len(res_calendars - ori_calendars) == 0, "dump calendars failed" + + def test_1_dump_instruments(self): + self.DUMP_DATA.dump_instruments() + ori_ins = set(map(lambda x: x.name[:-4].upper(), SOURCE_DIR.glob("*.csv"))) + res_ins = set(D.list_instruments(D.instruments("all"), as_list=True)) + assert len(ori_ins - res_ins) == len(ori_ins - res_ins) == 0, "dump instruments failed" + + def test_2_dump_features(self): + self.DUMP_DATA.dump_features(include_fields=self.FIELDS) + df = D.features(self.STOCK_NAMES, self.QLIB_FIELDS) + TestDumpData.SIMPLE_DATA = df.loc(axis=0)[self.STOCK_NAMES[0], :] + self.assertFalse(df.dropna().empty, "features data failed") + self.assertListEqual(list(df.columns), self.QLIB_FIELDS, "features columns failed") + + def test_3_dump_features_simple(self): + stock = self.STOCK_NAMES[0] + dump_data = DumpData(csv_path=SOURCE_DIR.joinpath(f"{stock.lower()}.csv"), qlib_dir=QLIB_DIR) + dump_data.dump_features(include_fields=self.FIELDS, calendar_path=QLIB_DIR.joinpath("calendars", "day.txt")) + + df = D.features([stock], self.QLIB_FIELDS) + + self.assertEqual(len(df), len(TestDumpData.SIMPLE_DATA), "dump features simple failed") + self.assertTrue(np.isclose(df.dropna(), self.SIMPLE_DATA.dropna()).all(), "dump features simple failed") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_get_data.py b/tests/test_get_data.py new file mode 100644 index 000000000..c6465b564 --- /dev/null +++ b/tests/test_get_data.py @@ -0,0 +1,52 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import sys +import shutil +import unittest +from pathlib import Path + +sys.path.append(str(Path(__file__).resolve().parent.parent.joinpath("scripts"))) +from get_data import GetData + +import qlib +from qlib.data import D + +DATA_DIR = Path(__file__).parent.joinpath("test_data") +SOURCE_DIR = DATA_DIR.joinpath("source") +SOURCE_DIR.mkdir(exist_ok=True, parents=True) +QLIB_DIR = DATA_DIR.joinpath("qlib") +QLIB_DIR.mkdir(exist_ok=True, parents=True) + + +class TestGetData(unittest.TestCase): + FIELDS = "$open,$close,$high,$low,$volume,$factor,$change".split(",") + + @classmethod + def setUpClass(cls) -> None: + provider_uri = str(QLIB_DIR.resolve()) + qlib.init( + provider_uri=provider_uri, + expression_cache=None, + dataset_cache=None, + ) + + @classmethod + def tearDownClass(cls) -> None: + shutil.rmtree(str(DATA_DIR.resolve())) + + def test_0_qlib_data(self): + + GetData().qlib_data_cn(QLIB_DIR) + df = D.features(D.instruments("csi300"), self.FIELDS) + self.assertListEqual(list(df.columns), self.FIELDS, "get qlib data failed") + self.assertFalse(df.dropna().empty, "get qlib data failed") + + def test_1_csv_data(self): + GetData().csv_data_cn(SOURCE_DIR) + stock_name = set(map(lambda x: x.name[:-4].upper(), SOURCE_DIR.glob("*.csv"))) + self.assertEqual(len(stock_name), 96, "get csv data failed") + + +if __name__ == "__main__": + unittest.main()

b5?Lf{VhYLdr0L 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

y*R%tg(~m_KX0k|*Ln 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 IKQIsdUtEw`od5s; literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/analysis_model_cumulative_return.png b/docs/_static/img/analysis/analysis_model_cumulative_return.png new file mode 100644 index 0000000000000000000000000000000000000000..3b79ead498b5f6172f9a47e18c72fbc284492d03 GIT binary patch literal 65813 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 W^{F$Cr?*YsQIc1GS1fDd{XYN}Fw%Vh literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/analysis_model_long_short.png b/docs/_static/img/analysis/analysis_model_long_short.png new file mode 100644 index 0000000000000000000000000000000000000000..8a35dc37c71a93d26cf9ae35752c762e18a1bf2a GIT binary patch literal 16726 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 VIw*Jod8CL)R literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/analysis_model_top_bottom_turnover.png b/docs/_static/img/analysis/analysis_model_top_bottom_turnover.png new file mode 100644 index 0000000000000000000000000000000000000000..4266d3f85767a56ddbc38f0083603197397b94b4 GIT binary patch literal 60752 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 qxc7GxR9nh~;$eJhnp2qF8FZEPbuGln)<#uA2M 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/rank_label_buy.png b/docs/_static/img/analysis/rank_label_buy.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa0eedda2fc843a4177bfe13e1456a48a2707b5 GIT binary patch literal 93661 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 II^gJk0l$%_!~g&Q literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/rank_label_hold.png b/docs/_static/img/analysis/rank_label_hold.png new file mode 100644 index 0000000000000000000000000000000000000000..d176b6d9154b317d564bf4c2aca267ee20e27f99 GIT binary patch literal 72184 zcmb?@2{_bk+xLup2^A8ur6@uYvJavpj6GvZ2xH$f_DVuXk|GSk*t3j%iOL#d8T*#( zW0@>NW(?oo-E%+h^L)>JzsLI?-*+72aJc6BpVxJr*Lj`SdH&AdUldgL783&(0|*3S z(z<=q00g4Mf|GlWc-TD8KsQ;M}{jI3~y*>V$sQ>?_{h#Xn+fzdIKT_|% z?$p1Edi-w-`Cp6rw=??xEQ$e}Z=H~EGR?I1C+;|{eu-jD=ndFe)?Yo? z-v-)t*UVN&%WQ$RgI}Jj-`+_9ZL_V^s~rh~K-<>57D--1-@(CQJ}^_ZEvK+hbU<#! zcZZnHn~cI}3(cu5#hxdolkF{*y$6EXG<;?>1FRemqvgeYn(nqmY<&Kh74Up9`%>0E zezMkENnU)%EIW>|SVD>XVmHq-bHuJZmyqYVB4(Zq2v-^7BKOdIv(s5!@eBvnAI1e? zLefAfQD7_xIF|qTQytLwU$q~110JFHzx)4w9C!r$?{fYW3v4;)U*-SVek=+Y>!0KP zSNpLj2_>{x6%ErlM<%2AJPz~X-i%7|b6*b6{oTw!@Y@FKPs4|i5zI2BX>UO*Q6|MZ z_2I1We_PwXj)8n;QLZ%X7N*-GO*#6v^AKQxRKsF2Ov1)#HdKdy$o%DW|4^a;{Tq9{ z_i2=H3Az%Z!}=gp-q9;du*4RjHS1+)ey<^;SrwQ*HrNx!V4R&6=+V&P%=~9CMMJln{Snu6x&lPtJW81=ya%qIE z1u?a_-(2Q?C~T031A|e5&o?!>AEBH$3RQT12pkV}$uUo|OYUo&_2?5Jnehc?lKgl? zPK02WoYVQ7DeTA6Y-jb6OF)Omrxwta9U6@s#KD@r)n&q2jw6T4<`;~?x^?jgFNIH zIeBF#s85A{4nDcX6C}YuUr%a1b82f{;%N{qqrl7*>Baf^diOX+wI)(-arjI81~&&C zB=}TdUO<>;lKWpP889P?ynIZhUZ~Sf=6{&&@2v%dL^1xgjR*i2!+%;kC90kWg|Ys{ zaBOrym;XEyt_)ZSv7(A5l2@iQzr;*kV9>jyW+#=uJqaK*A5_n>-!XVSB4}hYwuO4Q zKhfcjqx0AE@`aGUe3Rxy=4N}{qWycRzK@W~bbou4AjOop%Q@38@!hoT#o2kif3ue3 z<8<{>H!*@u>#A(V2k76=CAbl z-+71QNB+_a_?m>(p_E{f2y@E@MTjRZ42KwrH0pxb%rOpxrzduVMX2?O%zb;n-KC~S&mE1p5-fzOnu^WJKEVu;aAz!SEjbSM@&qI;*nDofx_fLXPNed9 z57A}t;wVa5vzUqN%{rhRWJK}9pMS@hvYfLXmvD)VVMp<47lluf8%f_ikF8F|Wa5D{R0KOAXTZB`;=DP?0G$ZU zpz%ntAP%Y~Ugpua(oVdrbJoUM_>&lLS)b?F^|kxicb;S6ed{kel6=aJ)3sPH-8yBT zw5*0VAOT!sANQPEjKyp3=&n>HC2{?XpX|A1V^xv4@KM?UIKTQDPtd+Iv%EYU#3KE6jkBvt z`!9CqYo0$DzIbi7c1A~hs)cLU+HEv>{KA`~5KBX0(q0UF@1d{7^p)|pbO+d2@9nv* ztse+XU~ofS{)j8nRLw7*$r_LLuC_R=Kf6kx&m9ehKH`(&{uvj@ptLJuUl&9Ewfy=H zW~LL8w(hx7NDHWmBjCMdK>vK%nUiT$xF}~aG3X$bcm6rM=es-35=q_;nz@k) zPmE2zzImhVwJ|yD^{MV~=={j9DXEZ%UG(6cs&b@)ovQ0RhReFTn=7rkQ<-5HUuCVZ z)g8MQAjIy@OeRmrGne6gXC_3&afFCP*rw%I4DY-5?;Vz#KT0F^-s6SSbDXWTG!X~E zi||6H(0aeA9q!WUv&kFsS(+lpcgE#0jgGYp>Od4J_2ic8nX2b6@zX4yyG$G<)tVYl zKLbYy><-uL486o#H&=Jrt{okchdAT4^`4%wCVM4t7`@LjQIZtbSBr5l+Smi65xILWpu?y1v;F^@gYdv)_@#^+(>}V-|LG11IbiIPM9^0*l69ygZ-4~@4pyx7)w~EZ zvQftLbAv)wy{Od}q^*N}!t5Ta) z{SPtP^ReA5R-(HNBP>?tIG3Qc@)GVc?BUoR>k+v!_u@d!dpZ9Wu1`UWkwT`s3dj(* zX__h_>O2+^KQJn=W%!2IR?*b6I9y~O4K_+@WiN{r;CFbZ_cH8kC$zy!YS3@vNUftYQFEG!ydwHRxtk!#y zp?>#M{EWw5n$YrbNPv5h^wd%R^|ytDs=mnIS=}u@j%!B#=a$RWdBE6UZj_cCwt!}f zm9JQmmqUb3!_|`}ZZ0rH?_N{(#3$F$EP2d6D#gS9MR$5Ht4VhzD<`FNgs}I>O5di` z)Zq)O6A)L5y4*Rhxz%pPIY@9>gq3H(O9uw*hdq<)xrl4cxld7h9LU4NLhZ4@Jv~07 z34!ly42R$H(8FbhOF`kp{`@4r3sFSn?cqugO6sHZwCGfC9EQv)s-#j6Uq1a`_ph%t z6`WyP5TE-#hMR4d5xHTB%#Dq2#=ugq?H(ok@?Y&Y)SN31S_OCBjwx%in0~A?#o%W9 z=7Z?9cG(Rb^7~dEzIO)pfZgX4B3BBFe~7szwAlx5+l)MHS$BU8OHzf35oS8l}#u_2XiQDJ#3EYEksXS4d3@oztO$h z5>ohadb_q9j6M38QMMC66DOhVD!&V?ynPLwzUsU1@?v@hSr|MN0tt@KW!VxmEN5{G zW7pyf%;9L6jaoi%i* z9}F4x1NdKYWt}I#*{4n*);QNoAxgDRolEVRu@(tsfvnKHX_Z1Q1q*UZ1vQq5wr-TP zi9Qe`GoZ}n^5&<6V)o4(3+djFV2pWZY<~STY?kZRKH6w`?Ey8sgl8gNQv#Dx zylF*0v$6iB|Dq;DsUR#q9ef;|qVy=G2|;8Rofw|18V|A+5QfxYK!lRGxnbdn8o1iTkE!MaoOntOZ-61+1%b{j&Tbl?tRLc24W zJ#clGYVIAQfK#wJ60?c5_>Il8u7!6g$17TZFV*zAW28_29r1&!Uku zEUjJFadGqQ?jh|TF`{oNC84EcaJcx+=5y=21yn#|APDu88 zTaj_!p&trgW`XF)@a_f6I?$t>T(f%mn?vp;7DRXsCW`%{|>tMw2`tONA z>(%7zPoeTHu{wf-Ge>3qrm#Q-J+3F*rucNOKK$r8jv7lT z2x+$a@Scf@IO;e?LhZp&y_Vn(kP!Iw^Cf!Lo()S`bt0`bFtvU68|qWrtuy>O*~EZV zW4UpX3_o0i7C)CC^$7Jg>1|uVY2c`I6T6IcbA=zxmI5=!F9djKi?>XW*fVX zmd8@!<_StGwYowOvf7VH>uz6+f9L^n++T;ZUOCh>OA6*hb(&w{@FS`INEaWiR9UUk zWJBgU9E{*g=ELPjf{zUQ%N0)hQRM7QDtf(>&bN!CKF-5^OF`16mapS#Mg5O+f<^{x zyw1XQ!+3m}3>OFZMlNJ15u#($+A9nC$O)dwGh(XU1YhfnNhX-pQ%s_&1D&eJ-Nw%DIASy`jzCE#0K-AB0~1v zl7g-CKTS+PfQ6~7ChZ_uUXa^q9c%F6!5M!=JIuuV)(RaI1!#FTy{1Oh>uP`YaF+3 z=&vDubhE$)KpOW}_jt9y(hC!-GBsHsbWlbLNSfS?z+Y4qpSOXrecO(#2E_J7mR@)3p(?#s<>0>K9-C80Xao= zP;B4cgxJgE1;Z^@s}iC^dCzDh6+;T|%1RrC5<~+Fwz^3!+-dA$Bb$jK`n~&I$~F z<)|PiWO97jNr0rQe?6ndnQKZke+WxaV-8K~QjM9IRx|Y2mO>CIp))^xu5<`NSyJlL z^B2vhvLWP`xjj9^#m~T6Wod-N5z{GlY^{;T_3P2UUXRFEIi{|sF;KeI-5K@zx}Qz~ zXBa%(=yn3-MlZreFR1j91q_iG=32}G6IlZtSlpQtJN$k~XLoO*Eh3fnAdHBSf{$XL zvx$Yy3|O2d$icZ!`UGy%?N(XQG&}stWrvKwj0p6@gwy)rh>Fu9@9CkbC3>%gJbsOC zDl=m3jy$W{rhDhs&c=$3yV*I@)xYXhx0xL5@`D}i`>30QrKH<#?Cq!Sn*UK6*yDm0 z((r}J-|Lo@He*ee9c^Tv6AX!nxTS0{0-8nzPYA>sUAf>eF`VkO+a#Ny9uAcWlfNefBv=4f`4{Sz7x=xse znR@*YV&`>IH9wClzq{W`SjyH$?KT?T>i!vomRIqpY9lV{X5)`AW6o+bq41%dc9kN@ z5LY9liK>`6q^B`=bw_TsbIjRr|5J6mnOm&*C_Ks49aF$`JD*-6q^uKx*g!Y~>HliY zU{)6!s#fmRV%C6bP^f$J?)|M4q3NUkeB=Bc-CB8N-w!WkZ?pnVZa|_*$wvzppk5>U z8~r75LNV5>>j`%mVSvYd33HqMe#R1nmVBVn+=lgaVYn{z>3Ue zD4*O8*jft^LmA1O>kxqs(xf5|721nEdeZdU7JPmvd_dTix>ap(S+|9Z0BU;C61$4N zJG+J3&Z2}rJ}HfbJq1UC;SAkNP2IkNZ@9qHXceN2)UJ_aMxn9`MH;;EG$It-CXW=l zQKvbM6}S;t>XO$#`Hl%G1o%dpoMr`DvqHfhTTE!(a8pRYv(>!5Oj}{4Z6|9=T=JP= zCwv4+$YgX6kt=imMHK(Z%V$(&kk(9~l$d4Zd1VD-Iu=T-kzROUMrO=J=Z*S5xd5vc zbEnRr7RmzcyyPH%xEU~(%!G1k`5{Eg7RGQ*F>cj(XgK(=hYxvX@{DIRTDsv64a8GR z?AvpwumA!uzHdAqMF9;gH4g>DJ*QES^`&5XN-R9oSspc0%!i@^)>&*;SKA{_rO69P z^vrDa7-@ppMQ#oTcCN=|QAl&{{E))HhURhB;(T6w+x#9AW7GCZmm*Ns$ziwA9f^F< zX0ysP@(H6B@lsuTmoZ`xNM)BM95(< zuT6VjD!0-&C&G*Z(gNKJ9s^~GN}KG(l0gff#YwsPoHxX2ZxiVV3Y>ZS>yH@;8)GhD zLXTh!nCmxez2Oca&&mFxek@`G_@;NpL7uTATh+fP2um-L-y_7m>!*_$psQPC5SC1d zS_p*EVlC;R2#0;<)iEl?hK8Ey6pQlD2)jE;hF3(~s;_qmK@)B6Okb#FY=tjcy^itR z2NSA>ZPTr0pKuIw#>Sj5*{ZoojWgP;{i0esxFz)ZMoCERrJtNbGb)n1wFF9d*UV!2 z?1DMVQ|A3c#>CJAxQq68CB4j!Q1Zt%)-3o5Ozk3)oI5Dr&4OC+Fxy8M4B7X_SWP|R zUxkR}L7^#$2fXpR`IXE*n&x}iAOLf<9VXewPElf`%1ER&v>&$|j+>VTb=iymn^5;l z4d0Rg*E=iB^&kQEgrbD#-u>8a_uS$KGlBMVs>w{ZdH5Zrp2IIhbz7T|CWV02wyP_}?Lh~naw*|*_T5w{osob)z;6;ebnwF6`bxXE z(9uDf47ID|Qz-k-Cd!WbCm69q^#DTj6~|}NBY4`1A17>dt_oL*f%rILc_|}0@Vh2nTeQq`>F^mt<}3N^^Wx*4DpjA=&Ymq zYCjZWS(dG2i`;nGn$;PWQ+u09J3VJp^BveX#1VP8C%hT}x!s_551IR1;Bhuv!x=Z} zx}_EQ`p@s5#5+ey5ROt650}{Bd{o%2neLJ83aWFS_#6T$L**;Cs3#J<86u2QDF}`3$=n(jJ-#;9Y@9HT zrKNO*$O&63r?8~mj@4eNq8tV-?7_Pw5*~jVk$H{??0d1@pq!Hht6*y8>3MS-EO?Re>bjt9_CrCmKmorl^BixXl0JTnadxQjP z?iwPh{^vKw?Z$mODgoM@!|zA$KSv_;FFCn`32jQZiu4N10n~f<-UMq{9{@6C_jjY) zG~6lC4Rg~#B)YV&gUluA^RQeS2K*@@L^?dx`58yfV&$r}XjQBS!$oC8*A)kSYT0I{ z=#P+M(W_PGZFZi4;in4r;V#~G$m!7e55fnPIz+SW%sEYrqf9vBP~Lr>iCv!56+JAY z&8sk2W#*IC%`LAMke3fKyLLeZEb6zg^Hz8%tpMJwQZL}?9)0F!E<~(aHZ^l)LD6Nl z4aj>jX47=k`d}C}yjCo;cNmEwPB;}71x|}pWT=XK1B|a^pt2w!g^8-*3m-e`NgVBT ze&0A3PAI>GKZB?2lM4#FuG7R3kXSnsRd*!>q7y;yZq!;HsZd21s~zH6;XC#G!5m&R zTFeX5qv|}>ls%mCrQr(f7jPZ!U;!W__T+veUz!2<7#4$Kfbj9|lo)&b{>mtOQU8EB zgxotIws!NjK!kocF*`}81YTcxBcuMOaVZ$xNayD284HehZ18L7AS|S$uF7m)sqAz5 z>yYl(QnzTLZj7)>ITr~EW5#D~>MTB|)8ML;rAKRD;T+ysj-3p!0AkeMKqoG_zBGuK z#DNk$wqPkQFFeIrA<1PQ%gKe(uHv~$i8Fmu9^rAxrwj<(mclJ(f-ZSj0D)c0((D`A zn*h9ALc{EnjdOBaQ)t^QlZB8rV#PSKG@p>JmIgv04=?rKGc1BMBSHy z4k;6LK_FgkFZk$2 zZSxt|FZSx}_p3r&RXCQ!@A)gpv;wF|e#Qu1&Tjs)o;&e%PP_XyFA2e-3n72h@J%PZ zE%=$(lfC$q1V+~hyk$b>-r4`5&~=Lak9dogf>8SQqe%b zSXrNi>j8!`y8DfiXjo`4r&gP4#J^15vNZV&-fQ$+y3xdsMd}T6#WEVdely7Dr^Q1f zq)?k6mgdx<9CY3rxu_PPGyc$%{dpi4O3Q0gbP(zWpUqBvGH*e;8=mqZ_wc}N{LYN0 zex~N~?g3a#@q>Luby1{3T`54&423S5?$cN2oL1C7Kyc=W$WO2 zV?#d*Y859skkx?*Nmrgyy`6lzKVZ!+9(-Kb!wB_d8=AuYP(C-9Ap6$RPF^=dVMaKN zIG1#A;V|cQ3>yuqoBNmLFCY!tpoH{D$QLBboq%@7tZzJNmsaRpc_YW7m+vEUwrW34 z+aF9AhN9x-Qhrx>3iVSUB%R9_pHB>C^J6I zCxWVIlB8P zk2P8oHizh3O;NU<6e*fmQfM~7Mxj7=Q*DKN-&eOUY;qQkPTFLKr&O6dQQoD6cbO;0 zm_|Vd)(2>)38fbkmb4DmfHESG$ja634?js14FvMzKr348NL`jkt1F%W#< zXCm>3&@f&`5n9AQ72`z=Rv6qSPOK^ba>f>uO zyASoR4T)a#dkMr0aGm~=<{sFDLpX70bg>BJTfz3~GM|5}btX@JIt{!YU(_c0b563m zf(Dzb;auZc`}&xxFeHoVqe9ib^kf(^5@kq~%`Kba^H|=Ky{vzRVmY_S!@a4~^&wT* z39IkBPoXUr^mX=1s=LlgvGj?yaLORf5iOto!`f@X-FQTH3R<{*dWhzO zIOTObwB$N^a8SuTB6YX?lu|3_sj4tu%VZ^8MkVovv^ZB1OJEpm(gBEACV8FjyhG~T zE+8JgZ`0;|?MHizCZQ`5SEkI2K0ggSE@05TYSCGDz54-(9+M806EhSBJ3BXGAmm!i z(-KN}8Ec7nmBrh?xGlVApQjT-zv-l5$XXmZ`ymRgP5up>Yx}74#QRA8J&E3Fy zHN$0OAs8Q5GMMgQ6jEi36rbpgJae=`9y)RFBGX~F^_7oS+Cgs3S$1|F-gxZWFt!qW$LIt6|PQGU2Guj%HAn{RwceNx%s{9enGf5(l1gd z>GAdI+>4KelWB2A^KXpAQa` zGMf{9^gLXPQP1d;)zf&84`psiE7f#!e+T$g0G3aQRDO3=cY*hDrKA3+olF=kEI=j< zVbo&csGB! zufTw$S5~k>dgE`+460QMjhm#vxZ@;FDVyU~$DY=1(|dIJWkFa2EXJ7@fPH9$( zglcoYn)GM$&U52U#q1PTi-Ox_>I-sXJU?6w*_3J)KOOR2sG4&S?Au;u=!c-l!?P?Y zZHm#x6K+7`MaQ{LVDo?2N|I()nq#!2#eeMPMjY^NX+9Eyh#^jqz|!o6AIgF~ydor^ zrLVIn?}m-*%G$axMXQ~%A?-fvST?BIE347nlFl=t+`u2M?r7<{DYvUHsI7*}&&XQe ztIkiRhsNyn&V0eRhd|cXKK$CF#{fo-9KxKd$p=LysRo9Rr*Ga6dY+P{r!QKNfAyuI>` z-Gi(ta4Ndiu09e^!Em0dijv+s8DRM7h=xwy7MH!uULbQ}Nbwbh@~z3If!-9Sn_QnV zd0ljs=ULGHcZw0Iv+O8e5ADp)Hes;J&2hH-r~!vdQ*9%9HAiXDeGqaO4a(t;W~Qjl z!snrI2$>~^>25(ezVBi!Rp*9!FLMY7`VXXv%zTV zqyQ10-BkZU+s!8<(d$sN%ofJgN+@=GjGYT*uLsM86nA%<#+$G01}mZ_1<}2)Ft$|K zl;@16LJBG2?m1g;PeHqFIcQM6PB4|=3M?JUIj4iZWGday_A|)iGlg`N!QGp6jO@4!aD4@B1Mr2!>cxh^GQGa^6ByyKj?Ya>ZaIWM{?ZH$5cnE?Gc_vjr#Zy_7 zP!ck;B4;T;fSqBF5cT^IT1EOE^&%X$F7b^$zus&4bp6r#>Ac{Rrj2Bv`l7+G|E68s z5ZT-2Il+B#Enr@e{E-))K+^^$JoXKI5uIaCf#ptRfvral4sH8Roe5FQy-AXrcP_Kc zUzCVbxxqcG#Dv}2%ZY8VQ!TmC+>*fU?K_QxZk+20jOm~t)a>4J&Xu2bd;PzvyAhD8hs&R23!YW@&S!MO3r(}14(O$cqCZ=j=6xc^v8!3*w=eR zk5>K6e)~H+#r{^_e;JpC%e@WN%I)!Eg$hgkA_z zIMO~Z+IL;faSH#4aOvn3qN+<1+i$p3RQODs{(2K#UA}b#Owq$#nD6{i>(WZVVg$8s z`1B?5pjRcQ76brXZGRlEulOYdl4d>eU@6aVmA9EmOaGgsTpsUFHiIi;DTiir;U%|$ zJF7gz8K5tX{y-FpfN=m#YJiB~#n%Q0Y(6Y)pV^<_i@%KCA!4DuD+>x} z2zm93G+XiGOT?%0cREUq+ciw-&1kV+=CWO4hxmh7KU5V8cV#Q|a*$=PL_)O2*M?EG zEWQ9)bd%Hz2`u5~ya;Bd*KBH@5$o^dmAO!R%d{g}Vctl96SY(?Gy5Q6gVG>fi0Y6d zQ3Nf6Y?!?m*JACm^{v!PJ~Ap27Od2xVNn@B?y4Tg`zUCUYjsR-#9UkEdSF{rohWJq zm#g1h^jN3(3bc?spu}xxd&fmW@t9!?MoCe?12#DXUIUr0$b6k5mF^A0W3W@NKnAfN z<5?fvQy7yNp!@mEP`wB-7xH~au25dGcK8Cb2+o!P+s&hnuMOZPDneEAR_1Qgc(Eac zZqJ#&yuN3K6w+(Yp#UnSk7N}?E(Y?kovk0)EZV(=?T~Mzwdjr%Q zEv7BX%~p9xlZk>?3U=B?1Nm2?qRcZ&wId6<1-5(+=6g;%cc*_Lr(Q*Misn*29Q#~A z>6YSN>tOyU6iBI-m|n$jTi&)X-+JzySyq0@)I!Wlh~p#oh7o^qsAjs_V}=5YAXQFh z6=YMqQ@(f3=uXF+_aZqix#_l>=0gT-WL(+_ChX_y>lt@pCp=a10!8UiD>FcTe$en0 zR|D;?yb1}fE=0oK7kl0hG?g|^_pkE57>3C3o&{0DrS6 zoakEq)?cm$CY!R zsKIEr)BRvVX|PZM0E~1G3J99+WCq!UaG@?!5u=me+>VflUXwX11Zn&RhU3&HM#70@ z{`<~%GiUUH+UJUv0?GB&o+vAl*R-;yw>DR8gI=C0#Lv7A$Uf3=c(?Sa?)Mg2zR5Qvh8MLy%J zX(`l}D+RW$uhr5uvN%sg7g5D)3wm5A(+v(sHAwVky4@6i-2kVU^igtDqTyXQ3;*F3viwVq?fQ*~+Cup(dOYw?N`AlU=T%~^N6i;+1&CTNx4c4BWiHhH}dJ-DDL*MDo zb(OuZ%aS~aicgd0pubLL_GG$7je8|lEYl}8G4N15s#9uvwBDHW(Ffa-zWeATqpC1i zh#S^(4B2_>jK0&>3Ex22`y{fDPWYjwN4uxKnD0=Vz>$N^-Oy%~+UMGN?APPO(`A&4)h3878Z8 zXckkTt@(VKhckCLz10*Y{NqH+3SS-J8jbzLtF;heii=0@s;75fvE2QZYWF1gd`}wS zVC$ZT5hM1UN-v^e0RZ-knK{+*BJU0|sxwS29i?R8?R?859A>)y=FH(oNaNd1%MVXp z?AUp}^Rd?*(0iM8q4g6ZP@b}%SDX$$g*sA>!Hisp*JDHKN^p6Skdhxl%C=SkRK0pa zH%5Pk0{1pgqPRrOWBbrA{+4|&?qRmWbrGnw>%F4e%F(Qv!Phjhx@Gw1XWp@yZgO*s zb$5W#S060cW*VKnBinoz*2ev+UOw&?4P1`OkQ%<#)UlNL{)?|pnz&#=$2*R@q8qq$ zj(r72kHMA#gyQvD14iuY(kp5{D7nxY|)&O#hB-(1p6O@e~J%bTGV@XyI9%{e+$ z39rhbtRSObZm0f>24G*fl49Y zE=LHCX^Qri1U{&E0T+Xc*HkC_7nz2^QZw#y)0T2X)>%6ilQZXX-jq6>MGp6j*iAI( zL-`7bH7=CTDBufCN82yBR%b6K37pse(KhlT)a}Qx{oU7~oN4{3w8k`HG2pmbQW5Rg z@fu?_!u02`A>UI>f0+n0Yh76$qr$aVW9@s?i@TE$HivCSAus9rl@sngt!>UZSAP|v zW5v2PdME+L0d)(47BWt1{p#T_RbPh5EK0QhHz{gdecN_K=J1Dm8G8nuJcnCi`xO@Fj$lOe5mP~W3@R`!1mRVnkGK2UhP;0?3U2Y z_Jq0JpdA1WWty%QAf%fzdAk=)%IAJzwj@wWaH8^(esZ75y5)0LJ^0NaUP0PA?Z(`^ zSgws{lhMcMEjz7@Vki0rcQQZ(VKuzHv3i&8C#XjbOW_4DiwH=j6du~RGTZGDmXXoa ziM=MvH$&&(oagR_!O|!JbXZo!8={lCCuH;OLP;xmFH!;xPi48q5Sizo@f&(GI}1WTJB?>_Q(z?gkjqY$gh)(csLRKE=RfG zz5X%mD~Nm(lhe^|7!}c|5SFrgm2SMFCR?NcPG=8Iau?zCn(J67@wmf`>YUqNYZ(6^ znSRfRjyVe?P5VO#5?q+ORp9uJl?i2gi~$vsgkO)1^h&(g$5%|g)Eu!PZ|q)&I{Q^c z-0ERNHP*h!ky*2&L@~-<9}5Vv@f*7g3olvilaTpHQ(YqSm;q}5e`5TJve_yr4Tam?99$}=z*;*NxEtC?vZL0IFx@9m3wuSQ z(+@GX3{9>hrkCm^@?@16S0^m+`=f!z`IkvO2X>2IDcoMbnqvpWE5@*%yz1>*c?sIaT_|4Om+K)tBYI~8cU;B^+Uy2$V0u2g*3n?0n$V4 z*)c}}TjA!aF~oz1v6c->cXHJ>i;{GdXs~R|ITQ1AKwUNU{62D-v8&h!ZNq}^Ioohw z9T^E*N~jJWubAk;Tj^b%N?=FkGNlbVU^oL&E3h%lX5E>1Qz^&K5L8pGYu#Rw!<#* zRcY@v*JFgRq5WtHyoc+hWPBuIOlbOf&NyoeBuz$Ss7FPB!j-7_x>_rx(W~0|AYbU& z`e2)}8XRe%fZ1@26&7`dk>7o78T@irU4UxL!W2?()r*Vwl#P~muX z^WB_j2aVR;kA;ty7PvX^TrX?<*Bvu1w+QUk>D&*f(58*q_3emh;yfP)vzn-Tkv{=F@?yyNQSF3JcnRUr(@1$?RUSLFrXN3%LlGorVAQ3aXhJON@yuotgKOWu z%$-mAimaK9l3D@@0yNBK(dIW8o$)l#u*2doQI}$bSz_yHP@%Eq%Gpwg?@6dPBX9)$ zUsz^}`3Z6qX>oMHUcpldlMVBG#JmC7lrul@OnTx$m^orxn?;(>L_`fd_%-Uwy^Dj255|q2vpVePpT`8XMq29< z8DjqA0{ExNFKzM$Fk#dH7Bn&V7Daf_{6{4DC74nx!(CGfi(9XS7fV1DFykGM#Y#x= zS-!i~d^=%Yr&u}Lz|s+C3K3TbwcivEJ^zP6zkSbX6jx}(oVDr}qzx*?N93HCnMh!nkO^ zSXqA5XlVmGYmTEybeUZBzF?b95^xW%ubEwsPB{GZ#VasmH#M;1S8_(nsxM%mdoZB> z7thn;`_|#^)4w4bZ9 zCoOdUqdXzVpkGG+R(Jz;hW@7;E{=Q6`7Gml+O9&AR8ilrMlAl(%+vBOH#o*3xbso@ zeM%|&kKw2LW}=Tw3;n%qfs}A-i3sr5AowPpuQH`F{B?O>h&j2?$u;&Ho?nn>|DlE&s%cmt43~( z_q?~L6Fdz~c2z-M-gtSiR;Tz@P&a-ePsI%1*}`_Z*k=Atr4S^|HZrLmv-fazxM&HQ zC_rY)y(SS+!${uIaepqw30H+EWj-?hem-;YtM|V9I}mz2Mscj`N?X-i1|}?*trpvN z!>{ZiA~SW?+*@LydR;wl8rkRfxf7fFS!qbAU$!4|-0AX-JgY0_x^@P56W}91a{6*$ z+jY%$EN4}u!Di~k%y5|E>N#kk?dOGAFMYKYro!H* zvy*Pp7dE2&-{7A+Rw6L!PLL2t@h%NOSE|(11jAFT=bP$PxEd!9HzvstZ_rfYW*jo$lvIz2f7#41FcbBhMuK!Swp&wl@1 zN?d49iH#D0;{z(wg_1ytf6eU4E>9@y=&wTYgqYyA>$3I#d9Yr1Og~>A7 z7rGy!)bthMXrMuHS43%c>jL^CGg|XBwQ8KR$eU2|*8>Q$x73yX+t+OB6tBU{^S<^! z(Ef4Ov#^&ydQljp$j?cMZsf0PW+m{lpJ&0fDMc1<8zilt+7#1uoAh$lrpP)d2Ee4=1!IShGIe z{LuufE0eQD?uJaODc}~bZ@)7}=C<0ajy&H8B_4`Ey#f{MA zZ;tBbu7r@oA6ktA zo)8_xvxer{ea&L6$(K#njg{V-KgFJd`-W#xWV{vfz_$}dGE~vYUvYpa$NPM-=h~%z96&Vg6tjQ_5}W&28aNl?3KL6CDIe9 z$6_$b8L4FXk+=e5Z;Yl)cuKm&&}hclF>Y7CzOz8Bc`hLvYS;W2IunY19@`-a@Q&Z^ z@F=I6WIYHFg19ntTA^MzeKytTmt+k?o(pVlK9%aySxLW**N~=trBs_t06|k#Cu*`> zcOTZMK-*totkds3`N6r=K1iCD$-QtIs~@i49DB+#RX%eyhv`AI#mNZ$1&k2J8atBe za;M zsCWC~1mOrHo~H%gxjm2=(fvO}orPPI{~PZK1!<9zRzW(X8wQA!z!2#Y>6Vgi0VSmy zMvv|;LAqmfOr>)UejjxHwtRlm8AS>vsOAyMOcko^ zm=+*i-9IPT3c8JXZ749J7Vq{AxIiFFj|^GSIMZ4gsM1* zBYRg3JXhObNZ@3}ayBVA>XHv3`^R);rj*<6ZGM(uV6|+P5F2ned84c|8}s_!F!z3C z^%%t6VGgu^>^hl~)1tgy#+VpqHf*_`?pK#f>`q{mLmXM_&w7CIPL zWv`6R`K3lg51vK#UyoMfg@lH89&~}wM;i0B-oEZ|=?Xj{U3ok9SK$+yb6!&h9AO`$ z&NK^q*FKP(W2*e+sXd|E%$vt!_dt69RClTR#vh3WD0WVA6DDEuKm{4wj|V;4RLA{uY1$4ViohH(dD%wRXW(OyknyAas1 z=A>4bg6P2!{8ZjYUtL?ormv-urc7vn@gKr2DI8IW!gPE?58Go z)iA?^{cDS)Q)xn!JK^ea=oAWc0cWj8#TUzKX7u2|uBO*!=Z+1ixew6JWoOYR(C)m} zCIF3$BLwRBbH0=_NJXXOdbd!|Cgc_U9F|ZR-NV<6b}z~z{BM`wop5Zs#sgA{$O2T3 zTv?px&8N>sqE9qrX8D8#4RJ&+x~9X-wbpPG^DSI&6_-VK1}6)-4a|{doqscsLgdwq znsnFEu5bzJm;~n%oQ}Gd34^toT)a?EQw zSAV;7c?o_A4+iHBVmB@etdc-&O=f&M|M?NrY*_n{L(#X*_>EJAqq#V+Y%g(}7#U%#!K37}6S7tHWbGhojw7KPCmLkd#EX(^@h z_re06|1HqKOhbaLxv?6-rWl_FgkmqAYmcD zLITBmg4fHE?9e>GO!$QV8;RJvP1V?GHM9D&qMv-kP(>;SGq*1G{7i~_VI(bMP}ecHN^kA$fNqT&wG>}Hhi>E%kN};~hON5= z68q>b5sFR@oev!EgO%5qg?)`B$UDOv*5&yWR2Rp%F!qgU;Ihq)ST zBz{%Ou25ffr(*BAX;aR?OBsIebGwf!*Z4Co?bnbJbjDv6&?!T#YNKAH+?tH*4hB7# z#BdDGxfzxkY|sEAvv++CnK(fX<{;@OHPsDr@dtUi7RmD$Bov5whMyOg>M=ipbh%q# zpMmWEEenD*jO=ZLGhF2XufV%sXSt`|nw8nc!VbO!Wfe81svx!S(Vx7+IETAvw+RE? z^)XZH<4Rit@z~<>Aj)DQ1t0p(91PiyzfuCb8=P{F`V_>zSdh;k8QgA5acDjHkbj4h zg}+ahuUk?T|C6#%-ayPE)=H0byDI0pgwMTyM-S$EaOZhSQ&rhd^Rmr6jPAr&*ZT23 zCH#TpsPazx>3l+SLw7p4yO`Tj9Z)fh%C}cqP`@85#b5c6J9;F)k$zY`N-M2R0w5^>k;?!PNOe3f(P+jZVQ0Qx-uU=`j2ZyBg=tRL({TYeSqMRLn)teX+H34c&cToAWi z68_4Q+>L#eJ~t_Q6(`Pvu-+uR=|>t~_lDyz*x36#g?{gPHaOoI zQDL3l$TRrKEm`v5oZ)i-)kBeQN`U&L%}USj`Ewvk(x{ic7U^n@{0nQf);$o!YUVGA z3i6v0%O_Vj^)^^C5Cd*B$y!o6`SrO%2}rY;u@{>5kd3zS6}FQ?*gZ!@?&?%1j;KJ zV@w82kN`=Ntb&{8yS|>~KB3><{@c?}k$NrgugLf{_#{nZ@+2Wz#I{RsWz%~dbqmO- z1TOVhJ7;An;_X@hqd+HSJncd!t_IGgtCWp?r=e(QLcXZpL-%a{qWIFmaNPctxCjJFlCj*xYp z<+3aM_wUzJSDuA`oqDAdRnqd#{mTFc1@*1hmO836uNytD+9R>(P7>)dro5G2btYNh zJ|u%W>hK7Tx<9X@zZBs3?fCOATa_4Q2q8=iGgGK^yvUaG0MN8W_UR5}gSrI#V$JYT%CDOKGcab47?a)MZOnFWjdwM3jpkG#-@`GoKR~oCy zm&0OUjpnE>`Ag&`5+M>dG8ws(j;F6FdYwh{eALZ!!Mac``CPv^*a6&C}Gi zwB&AjaC_+a9AhjNoz3%|L}!hl*v^(!_tgn^L2B5#Bq0gR z1%4#S-#uZ_eioz+pXs5j^O*ZaZD2#;YzL$n*Gm4G6uI55HM@690$jiwnrc>J)a|C_ zrC7^OXEo!~AaPZYzsolG!HLE+DfG5!{y?giG9X^Q%bfP=@wQp%Ur;_+2|V=kmceMK zIm36H+Y9dB%0_X@9SN37!$2yi+mm1+7+u4)zvE|}sG*Es!bh7LUavP#X?qoVseW+^ zqUT62$1*N$^CCN$R*S5s;PQJa$ zzU;c=%wTy2RyUQS)zIHUJJBq})@^RK2(>_)iR{a6qan}u zav8pEh?a-f@>|5dIE9_a|B}%wmy9WLUE?duk`m6?w5MwRt+x9(z8#k?UE(e|=XYY} zzQ4c!gL#ygjKdJnj=Z%l29`{m(Cw-PN-FY&&VyZc*4KTu7lMVq&ZvPe_RcJP*#7u9 zNrg$HT>Sntt2d1D!G1!#iL&pWsf3^S#%hIryES)j;A1(Ro8Hs2=UXHnj&6cCbP8X& zL92eNF{MUaf;160RHtgCuVp9y05}5n4hhdDDsTASL{c+G%HP;LPn>#a2S~vLcwqFB zZ{C)EjLEu}7L5=$QVG44Xk{~7y!+%+Iemezua8zd;}zO>{WpzY ztI~k8E?Ea7Sc~VZ(&)KM4)l4(p}d-QProO*SR2exCpF5394jfaVvK{f+h`)SqxBB~ ztSWmdxs;*Jh-6}NzR4yka40GYxQikg8d`2Bj!v-ui#J^Bn59gzcatpOuz18UH8AA8 z(vu+zb0U<)P1*poZP1sdISOKvgivLI`2!D0zdP#^BR(ud8T~3mMhdalkk0e z=8WS31EfnM5d|gCrBB1xj<)~(d*~PGrgiBqejXkThAvF116X@YG>3t)o46VF-8+mL~aWTe9&w~`4H1}_j>uY2u+bdwQhR6U71H+OXv+(F`%6knf_5f z_oVBaUKnuo+W&ibONCqQ*w)5*^?IMK%R@iQ*cZ0b_vHCmZ=h8?%`kvnn)q=Cs(MvB z=PW|M^O-**pc6n4$SBs=s9-V1ItV9P^-{z)Ah4Qh^RUTA42C|65H8Mk?nz z7x`~b>04UUh+mrYhB&lDCzM>)^SAx>`pn>Z`RAS#;g3o%ZaJRIjPr!SEJ{;bj3OtZ zfQ1)h#XsO4dH8=H!Sb;&*3K%j|KgRzMx4ILytw(=Ozj}%-g}7o05N9f*+xYJJ!M;y zAPm@)!mIZ0qbG^W#`T*#%^$$8%-#aRlBf=)&3?Iq-I-Sj?BK-h%D;JOl2cev+*nT4 z3z~bItwZ;FZC~BCfAxPS_SNuS+?HsOf9KF19XQe^tRaOy`mw^k9W0*12X5z3k7ci= zxnktUvg_`D`|vvZ9)y{rP zq<9g>@j5X9tgTl|B$ngr+N@{Mt;S&ERWv?~B_|y~_^EY`g&!lro2o!;J94dR!Q!(w zee}XdM_VjX()9y11}>}A8UcPeDECeRD4;B%d6Epov+g}Z2t?4w7oWG=SnOG#nZ^N= zErDirHfB`_-#{r1-BJlIFbb|J_Z4o+2)SSSRyV~UbF?#k-g;R&Q_(eO`d%(38Fg`z ze%oZ$W+PojDm&?g@bX{&^?-i$-amPH+mZ1 z_qB59`g^V0=^x&XN)+tk?SajdF{mP|U$U`81?by_EC3MiawwQLCzDX@;Fn70NT zeE=F?jGr8%61^sp&4zVCXd+ZG^<*UQY#kAOYBbB;%po~vqw8R=5$+_u;gJn%;sa9P zN2qT}k@@AHoSLx&(-eUg(4G`D%HoUE)%$J>F@Clc(D+*FKkJWAW}095IpK)GFp)nl zrCi5Fkdea8r&j?yBqd)}YuPEBAQNv=Jtq*`;7k43X_~(d&u}X^1yfQxhn&ypBz;yr zcnRYi4{;zmB0mV0Z0Ly{&bk&Y;JyucfJKYv8Kn5wzGzTj>&?~K8)O#_%vU_tF1YO{ zo_0Y8Kntni#;t_e2mDyp%}cWYuc9(u(cjB_!n#wA#O6tQG9r zmK&pk3RRCQk2~`bfd``p;JgtT+l&*L0B#@1IJF)jK`Ext-6wW%Z1s9)ZqxVvWp8V1 zXrzPdfpLILr?@t`N^Eg{mI(zk?1cOG&#KL=KLlQaRX=#I1Pm+yWNuSQu&YLOJU;)A)%w>XI6)n67)6sFAu_Yxv;&Rh zTCn=G_y1!7Sa>vO3o|bnT)NzzjhM!j1m7-cc>hLEmzM9B&7M1#SyW&NQG}ferK}qd zH}IDpzh76laJ>ANHoU2}j+?k<7vHV$u0%#}pkZzT=*Jw;mA^~56FEP+G%wNGp?_MF zmg)6qLCAx{EOnd0)g$6os$;+uJY*y(2%ZhBrtcE8$jQ7HV}f+uDWKuttxZnBOj;&N zXIIP%6h*tA8&|MP7jAcBH_`aL-Z52a({Q{ERVP+*_i=wInD=zB z!8bwPsx^D(H14&TZEV;H2vUso-K=`=y6CV915tkl+ZS4v{E(_^)5CJ_tz?utDOf5g zV~)Q*USV^NAw*?cv|Y7~R5Em3zg&3(!)naNYT$x35)i?>Uy1~~u1Q6;f_06PJ=b>p zJv1vxMN#A3AC+Z>A z8RPa#f$fIYQi<@I^X9c}A`5fB8OZFYa51=Iw^0a%Hcso3_F z*@s7S8_w#L1W!O~QWyuP(!b@`$Uw$$S1)mQ>p<34gPr z4aD{@yB`l}ojNEHfF(HSCLNFptBXnf`c6Ufb=kby!$VoUuM$p0TC|i&wQdx>{2O># zVsHOraAI(=KniiLsQpJSWFEU!UWe`@FX!PWc(ggrbv0U?`RxPAK3&#&5Xu~&fxTY$ z06ht@#)65H{Jf)fHTh0CKrz6UZ}X$DS%`8(o;%Pq()Eonza_6?&Q*q=e*55+N&9fg z)Y2d)ZDpvUMoU#h?#at4GF%v9CqcIOVyKkxh4^i8=yTIX=W@7jX1Jdsrk%cPM)1Cv zT8ysKt;7_Ig{Zt(F($&X3nbO_MYT-oug0^h8;6pNDw<_=+O+cu^j>I&#Yt_)pRP7Q zB3mddh`acwb5Lt5v(H{Xc+Va}=kPN;BXXrx-aBER{Oxf2&Nc<{r) z+s9y%q0tWRr0*<+Y~rp4Zyou7&4~5QliDloSmLoE)2APYH1K${g^)-u4~g7lASwAsXKPsyN=F z>*f}pXRbm!1N}RspF)pdTMDl!OQa5zA(Wjq!=v0g_En2H`?j24RoVTb@oS7FI))DA z$8;Li?_!0Y?{}@?Es}}Zl3yx?FP&4YG;lu?Z&OF<@DppT8EgjK9^}Ktty()}6C5GM zVPPOPEr@!+z%$(~4+<#qDjieEyXrkgI3&dIxmx+D6#;b5?=+m$aeE3)iUUoga50bn z4N}MvF;1LZ5L67&UY^R&x1d;AX#-3gy4^-e6dLNE!ZswOz$Nk-8_TU=C!$#`kmHW< z4g!U6%~fP5p###heNF4}M01X%M(T%Mlhux9sIfAT)Bs1?}6&Jur4a9zT;< zP+J7x%00K8>CTH0dTtLWY8xET8d@*g&bX+lBBYK4#!0)}0Ftt9T&M|{E*)5%`8qW? z6sxbx%uY&RyL@_iko?Wd+B1 z5V}k(E?|0Sn=1~4=P2tjES!ly1Mg&n;k%;0l@96YL1I@GjrkLH-JETt$$6s1dG{W_ z22wsgXg9Y7gYLlY<>%0?{E#JSHpWZ(;#)3iS%BZyC()>SazPh{iKv?0sUT4A83dFt zo?R;gNjLzF96Ud+RcEIDfm0;a*aiZEx>-4A3$QGk;C9Caul5iiUN87IEn`p_z zG{#WL3t14oN9+hCSW&#&s%ivJ$=b`MXJG1#*L%BVUeo;`F`mo?r*}ixOY`c{RVS^$ z^0`)ZL0dYh6^~H1Gw*1WJ<8GzS%`t)Q!#t@FduQ45>-ot+GmqEaoD9NU6Nr1eC+|T7q1Z4u7^XeCc=Hw204{ zINqpCK5A^$GUffi48Yi4%mG^s%lvzuZCy7t8{9GNgrubE`&9XviRD+Hqy%f<8@hp< zTL$-a`~V%yNfMv>j?j!$TC*&vvnE<5PXG?^3$98fN=}O_v)fxI|=fB2lRS^tu zn5Gj&wrF>G$CVd+zid6%Ux0}jU)`*_*;W|J1pvMT!$em>M@R_9!En&AmpQ}=KTn!} z=~sQ07rky2t4f%U@mf-P23C3Rkb`KQt#%b$;*tvGj9uTE*<+MOapM0Syz- z?o2ikFpuF}-bmHGUFnlMQ7zRYSojY}iH9$3ys5KJ4HOo~tTB5g{+g-yE_)!sp@XtNc=jQh-TA!Hy; z%Ei%DR>O2M&@fnI$eJ%4t=`6nS;oH|H+=-F-f@m?NbkjJERL}d|4_|iK(1{fP0Pn_ zkhEv8TV!`$v6xq>a)jHoDhj{8ts63*R4|amKsa5hL@^mBReY5@wGO4kDhCiC(+Wr8 zMnln&VUJ>kL$X{svrRMQ2%i2JIaBwaoXz8>hL9FHiGPc2tm#bt>Da&F^9}1>CsCW< z9@MJn!|G}zg{+N7Bxb&zyT1Sw`LHUj9X+PSjx@uuMZMW~Pi!ca45qdo_w}(w;=^)c zzOA}L^@<-K_Ig2MdJ7*)vPN;i4}t~DI0Tw}>AlDK;b9;Cic>?KskQUbD~5h<2j+Ql zU6zpTQyNRqN2wS(Fv@?B@vWeGi?F>WhhMkW$0OAJwwZq|5Ny6_jRe}KV&_qPbPDm$ zUNwA3Ek}^xo&1WS=HU9;$r7l$fSn_3tu#yVCsU_xj#w9+w|x(x^m(N3$*Cy{R|)bl zc8i#QbBPVJ82Pb+Vw-1ftqSqW{#}>{70UszdTGT~NjrR4lC;ZVuWm4MOazxIjfxjm z!KCR5ZCnUg=9u&>Mt*(-YrFV$v(#9fF=wcR-56LD2!NzGMGBkY*ogUwjd!_cI;Br6 zW8HQ!VubJe2WZx4PjPrLFZO0j9IbH_jz}xuB6+Wt%Cw{Y=s@41{TqNXq`ncPi^ zm7@m9Y3DFv_?M}$@&VM@)tYGR$4=)uU&gYbp#7f9&Ll_DI|Jh)*u1212Wl_=$KaQH zCznDVzrmx`fv$y5{|R-G46Mw%pB8KZ!;gV$7SaH0vnGz3{b{!QwLCJh|opI~V8x7-Y^5aI>jEoZ~#r0C`GPRBxOAn5(_%(BGkdE=YmY`i0q_1=(deI7<|Fii8M@+87tU za?*t&%}so=n^BHC3cM-g7E14a2@FsB$G5@FVG80=__Z4aDzL`qHw6ZOHsjEIWfuwpFbO*1MGokNKrDs{QU8 zFyJw z*^s%(>YG&&hMW3XffqTcK=`&wjThkUjmGJ20>!n|=QmD-uzw7B*3$T3Q<=}UP_z4! zsTBX3l9JZ;8x#dqHYt#UjPv)1RE6GbSJ-_Hyz0FpTAs4Sq-a$UpYbI7xoekMBuRA| zXkEGNNG_!bUa+IRBJV#JK+*IyOr^7fajAE5PA2B4mYJo*d}B_;f1{1azrNpr;3$5b zl6p!3t#4e~C4jZ|fYeGK3lUXz+5g}YQ*3rWGeJ=wCGDqihI?fbPL7u+S0$p_W~`Kc z0u*$zX-sP1WT{JaZHC8J_a2>vTe-^fJ`X=uw*Cog^aP+VtM&K6hPnZMtA`V?{L%~{ zuj^3cenIGvupyR6C5E*NL}T~;gy&k$DBU7Uq6LfEK9U1O08XmKpo%S zwA;zr-iLG~vHS~5%##sxIlxI#wejKO6|d*W6I71UgE;Nm6LRb z7nkJV#KGkW$H}v8F68`G_XO08K-1;s+UPu@jkKpyY(e1an}OELx(IP>$mRCZfHB2( zXpql`+Q6Q&|0WLnVhJ)}@LW!V*t|eAON*Wmepkco_AMB*#mpdrbUA-+oqwk^mpc@5 z(-f<JYrZW&)x0phM9_zjDPN!0Al1gE*9 zRbRW5=}CnVle3rID&sfm-?F*IpBUPTdDg`t(qHyJ_F|Ob-=NLk<-F#bZxEw+3=KRs zXfWD!CSrer&amEQkrHfB{!O*Z*CE}yZQe^SLvQ$b?nvU97lRK=@4U)Wx6hMU9dSWZLY1;Osyb=riu0}te%|MPK-N4>9|? zdSjS`Cr%%$*l7yfg3enB^nqu&G09k=9+n=6R$z!sak9HK{fN<3o)35_#>NFmsG%DS+Q4tw=;V|ZJdY{C9&hk zlGq-mAY4|;3n*&%_@daOg`_KF{@$Phb!#NRawDH0JavFRaJj$$jqa1PmV2v`BL3zp zJ`UpF!0a+4r>#^0AF-0_XIDY_-Dpw{KB_Dy{DlmrkmJZ^vI2#ZTZh|P{=sd`4t7$B z;tbl&x-jV+&LLX(lM*+24m!}bQtgy0)AKoKcijMHkb;@`xry0R{Iu{mYYRkhB;@#C z@Pf5AJK%rt?U0AL!q77qsHBgoVRKbDk)2E5O*P0R9J^7-ZO`-Ron?8U=C#Mnsduyg zWJA`+{hEkAo2CrNJ?F4P!bC+qBY4&UCwSQ)@}_g4iAHr-`zTZg^xaYFt=_9*AMW|C z4hYFY!k4auMREcWl1L-mZ|7nUGc5^eK|UkJ@(d`)DA-n~Yvq|yU-)=s0*g{Yu+I&{ z&ig*y*8RbYL0+W^)7rY&cF`cby1uxY^w(ny;$%FJO@|@(hg1?E$Dl8PskI-h4ED?l zU}+4{C}aK&ahdWklsceZHLkSo7?s*Gz}wuc=9Vy(lINb_r@hW<)e@iO<%tTYoeG!; zxJYSb%_OPS5!$K|U2q-@sv!0dgb@1(yu*dv!4)LrD??Hp!qvX|A#Ze@)>95ccThli ziLI4ZO286+r4zOj07&Aa94+r6lhYfRsB7VD<^-G)h02{FAwG+%#v{~rw^h`t`!{Ys zMZP4?@L% zQDQjWx&{3uIv%b?{^G3Yv99;HldU7d$Qw0;n=-MX0f+4yoQ~<}*vYE>p_Z`r2M3BU z+SKH=6N;)9a90wXJWZ8A%=cgQh7nYh9nkqY@9-&B0jTCIzid}dbs(2dYE@$Jt!7L* zLw!f2k8O^>{#U-tkFaM#&|J;2@W{As-s)!F(JKVmX+@_0_(H&5HYKSCIP!O;lH z$wG-bBg%%i!iNxIDJuu5iVCx8xt|_cM5y+~-K#6=auE}gz@TjLz$H9{k%Txq_DL%9 zchpr`uzTV8O)7n=j@B^9pYt1jTdl0XQhb7IuZy?CE#?J@DKEhjME+v1__qng?fvs_ zR2L!vAntbdXY44iO)d$y``%wdoFcp9@K+n2cjo;jgYZE6nfYVuJhl%hs+|#SO32P( z>7z2YasmWn_sa*urwx1U?_4;}(;as^hSW`3>@0p!$uO36C2L^WRt{+L4ho|#Sa*(u z2gue^t9)Zo?x0F8>!FKWU*g;kf2MQHWxvXg`*idg6I?F{2^z(I#L==B%EE^^<(g@y z977-h@*bfQclR=7VsLI~{_OzLfRL>DcHp(T2 zif_|v8f6dozhB_mA@oGN=7*Y&&e&%%Vz{2ADCyVBS5+(OeNgdudeatRH$|>^Nl_-g z4ct32Z>Gga5AC!#L+Wp|ck zD{0t}LCZ!5q!C-Gt%r~K-@4dxhp9F%5Ss=D}KrUfaqaDo&|VoZnJq7p}w;DGD2 zOxo;Izd~kVmwWn#?>;f&OW^WCiPYi7it%H+>{Cw8B}9ty`14EFV>EH%E)jdzqNm?L}=L=%q*$!W+N#9bJ0~*LbDZ_!I_7mW#XpQvbr6BY$A(;Jtul8gX$b4 z`DVqG?&6t&inQh28xkzL=BNsnlZEF)j<$Pdahz6%zWO;2=KuMvAd>y0>C0vV1>PExh{hs?uEM_b8J zI2Uu7&5PGV(#X$~v^ZtB#v!kg4#+XYzVMAVd5Fv+e`3V zV|Zw87N;)Ed}>qC!s9)`NhNeDiu`6FsD;1~nqzR5nY;||8ZDzB5{DF<^Ohx~zABh( zaHt?9g7$w443JgZ*=0}&y!+H84P_5F_R-(m?$4E5C~hmT*3a|^WrvwGtg*~Pw&Csg zut1ZK$Wv^&0|-z99heV_PaP$v_Gc;|UxY%cQ`R4MUg>qrOOg$z4snYuiDd(%Siky$s3f}Rdz)vz?Jr6HM9CjX z+8Ws^dFZbx^+duVIZ5kFU0O}6Qo1CtJMZ|puT3ETqs-}$Wq5+KeV`R3u$Wu$HD1=G zh#+5gt^~S%!nj`Q_zV}ouhSN+d!2N7q!<6sYLaDdKikksPX=-yF&JHZz8%XB`@77U>;WD-bi8eL zLORBjIuF}!i$PfpoZALnnWUhu|K-=wzF{M(pC$Rwd)sDi0MU7w^!Z7|Q_j9qKfwZ3 zkyjSLcqfohP-Kyz&0BC3YJ;iXlTomc4!Y-wHd}YvCX)M!dVU@(@&QEK4KYeAX z9dkC&yMN$_hb#1YWsK4(LGo3*GUIFL(H|@5P0`_WP{zHar=su37}#(WeWcC&w_fM{ z3kokOu2)l34Mewk$1; z^E+)p`cdeyuZEEI`9l@$bb@cQ zPn(p)ieB79xPb6CJC1IPilH=Z+i&Oc-~S&A0J|nn zykF`{ja;~|)NNwx&UNQf>1dX#i#}f3@-TpWt$t~0p}IIAL#gZW9L!MfBV$;9RcN1b zbhLaaNqkqOxUHisn=RBScjNP}yL;hmAc_&Z;9&$#nXd0mqaLT%qf{1h>W8FD7>uZ) zr5tPZbq=yR>p|$k+P)6Gx}7!!alK-S5By+XIAJX-8r5{XRE(}S`O$14^zEUxw>@80 zfA$9yZ~z+?OJdviTGq4edQ6Su8_bcV?-4&j#OxDnsOW9|osH$Dkc8g!m0WIJ916f1 zaD_f_N_&2~d+H3%l+m)NaLPMc@BHid*#tt_&FWV~cH1S%mcG|~Tl+R-Ir5>>={&um zeuxTcO5yrqH^?XXCy^139exH|-pT%hw~^^TJj7!O;*~PiA^uoHOH)z|p;zOw=$STb zVc_TrCkfk1@)S*3nzIkiIC@b^CJqnO;)guxdOv6IPMOM@lR?K~qOhmIE}con-fTS& zzTw;bWwMC23#5kU)^$3=viDd@2U2X~n)I5(b-m?Jy$ymn15YXy=aXPs{5aPhaf=l4 zz0X}HJxt+V_Q1^wMh1IU(^UrkvtL5$Q7*JAbECkhK@a+3wA>;Q+M{)g*4GK6~Z2G1)nFb zT{Na}&U6`+DWmmyyq}Mse*aY1zWi8X*|B=5QgW8W1YSHAROWfY{*}9kf)IwSN?S?T zt5Y($P^aBw8}!z6UJSnAJ?%XWw(u!7NW7eU7sOTTEo}vL%f`;j%v(6#pUD6n8QO;% zctsoNFp`0zWVZ$zoP*d>22ZOqA9#L1n*Lp#l@;Z_RAS(^{K#Lao&5~}%!8wWs#!8N= zV;>A>1p8J646i}H)lww&%`VG*w(Ka$dRA7Ktd`NZWKLwabXoEXLTQrv#7?F6GE@Ij zI^62F_D0M-lCeF+z%TIbA!=p3g7&yVZn2uBUvNB=%#ChGlS=dQMOcE z#ubv>T2}qhMpo+>R%oZI{C^AiyWr)n&6TYF3x>k#Y6%1$qFlsTF-1W71+^gjB;;Xf zue!5gcsl(gw3W4YwBe!4ulnR6NfzdF7=_GC>b@Eu$HuE)t!o)U{H76kzC6(y)TY!T z2HwQiZX4ROwoQ4cnp-{Xgm)WOcJBKs9loo49eXDx0}RmA%o##9etmNMUD&?mF(L#% z2K}LRJM1i%^XgWw%qj4Ds9bqUmHC_DIl7`}HnlhxZj6F9{x}XI`2&>oPA_j5WF$T( zJv>1(jPSQNZ*-8u%H|kXTG6S85S|p`PdLDZSI6+FI^wtT_$o+EWZwoS$cY&m5XTGV zG|5bR9|^W7U!q6UUsGF@M=xZPHMQih0(8%Ux2!(W1jlXz-SHwtP(Y^LkGf~2*?Hv; zB{}TqKvKL$PPXo2X7@>RMH`bHSj%tH04G);E=}?+aHq{1kZ{@p+8~k6V`^lVc{iA9R(y+%aIrrCc8fTblEey|ueo`}(d(vj6>9revZ~OJkS43t(y^b8O=6F- za@i8(^n@ZSYgD#}QrKgSSC~6P-;0nmq$+MvvTG{-kZF)T2#L#j+QtRCFzvQnee>pO z0f9Z!#^yKQcGA=7bf0C~=05Ba?`AI|gDuGmHWX0~XLB}jXyAU0UM1+y2{l{Rl6apG zq(DbLf+IZRY8-|9jAQ3UIfz=FBFaHoJH+{^=RE8Nxq?_Sy|4SvT?apHv}&Ku7z@%4 zg&K5tU!Knx2w;1xzas%7W!NODsGuGUz|GLz&$+)()&!f?r6%yId_tS+yi=z~nova1p)*m261HyIs)LsX+g_F4%~i&fs8a`1_FA(nK$t0eRMI2 z-3be2vRd6UnhyckoJg^-^X+N^=o*3odD#rpXboco8>0D=CF+;AF#A=K7{hdlrtBEz z?AzVd0uCUwgYjj|k>5%JWYIx`k<_HH-`j_jP9`bOiypC;k>lNbv~1Ryqq8o`lg>d1 zXsk|+NiTbo*tNMldr)x1LH0-Izi*Cm1kHNS0-*wo_Ut*ep6+fZNmE9iO+)d z;ihG~khA+rYPb8_t+}}S&jzi6rMy6W!{PW&9Z&WP>e7KH6aM7!+ zPg`zzQFE-h0cDRGliv;)%wI&i#9#8D-a;XeA|KPHl#U&J-?yGMywRM(IWkLZ2igwU ztm8&(ywaEq-7pg@r1bCH{sYHkq8DSE+Uw~Zme_>%S-H}l!RYBGx)!C|oRG1!7Acd) zIrOE;!LhTMm2OH$R6=0s@(dZw8`1M_{I3=triX05ren0)(&Dao=oZdWd#~!|bx&xm zhURlvR46G;!&IH(y#Q!1g{T)$KPR(i;a=R6QTbO(vNXO}7-M}Jos&r?*k|)52*~rEIG+F;&sLIY;h!>QV z1(M?IxnyIJM2ux8hy2ChdUX#>-CzPLM$1Lb4;kmy?30+uiTRl%b(X(Bw_iWL$T~Q9 z*DZCoX1CGC;xv4MZD+W4X%wKKU&?2wbnve!`Nu6KM>(5BwFd8U!K%F4U^lAK(V&Q+ z|Dl`7xuAN3qNvuCG;tWDYXBHP#s zBfC&Zw(KE{eX?d5yHSMf(b&c^WjBn;GBnoTTXpa4`? zGy`jO`wB!!VIkh^H^?$`3cCuQ(vOA0#bAQf54hD1NA9;NJ%GAfVEQt}h55==-RZXe=M|tZerHVqkx#;?8jQBjlaT+U1Bri zs9;8Nbfs7|1?bt0QU5}l^w!zfuaLErmsMbxH^E7WIBy#{$>!-km!fy!I(| z{U2@$I(m2{r&3LR^5Fv_+O;xkIN=>Ow1koEjmE6FeV95sa@O(q$}z-(9esiI>TM2x zR@iagxbfGtkGMZ}tpTnSJV{Or>f*<2nWa>|5BMB!6ZiDF49rW_^*-(S{OaMY-SMnd zatv3qb>WS@TMi|7HnPYqA5NpNJ%UV3JniQ*H$}_04uX>2*gCGtU)-uKF06KyFTj7> zYBNVe=@a_6KZrmc%sHF99VT}$nx;yr_Vn;w@p!;9S&f&n?X=kd+S@fxycuHl9&K$g z_Ix437BF+bD+o9q*8=1ZKAJU+Km1lpdpH&FWiW9}jhhWL2G2^MfBMbS7Qn5})dp;a zl}UghDRR>*cucq;3wpNw#$M5f&errv?OaOm?x0LgX07B`=vk>l1&^LH@(!n+1rgt@ zlD>c%cdZkaV`k$LlwXQRcxd$O-r3bw^#X1x&1QJ87{e$vjL>I=IXf)oJe>cSlOYHA zk<6F3T(V^taGGb02R~XrTbZoCeCJ zq}%tEyG2TEKvC%GYoU83;%+|VGDdV?!WpfG0}7cbiYqBX4u%qV(Mo;ODS=U1gn8bB z=jX@Vh3qv$j_2fh3viJ(h@0wKyV@B6u5$G;ZkG-ocRbaYQ!Hl>+(h2HM=<71UhsgL zXM1fFhMBevFu-2lta9@RKsPWuhrPi~k-#VSR}kLQ_(Kb-`J*#zGzL_vfd7LNDtk$E zEqPt=p8N&FrP5Ummkt4NT$X*@)7|Im2}!K1ZFKHB4gN`hZwBRG)l~aQmMe+g_&|xX z4=qS8V^z~v@Svm9Y9q=-)gc6ckEG1@B4K!Tnxhj}|DgB$sTg=@qd=9&<%bZ`{ehCn zBxsPob0!}w>f%!JP7VF7d(TFm)Wko#IM{N)q&`ADk@?W&zIr$)`0Yi9w-9!#9@y=^w*zC7J{dVjvGWc?L0=BXfNofg7p_aasZz)ZcE2&cQ-2c$o+6vI ziIWlVo;f!@Yr3c!9OQK>%Ov_phXq-Dm?^yDtq|<CQU<@GE6_FeXAC)v zWi25Up5B6oo98S_akrdF~_TQe_oaXsO><0 zmqu>YYnc)W=@LITK|s%pg6B6c2h{?d(Y!mqc~L&hOU<(5X$TC4KAyVhRUF8lQEfeU zal4_L!^z?_@=VgHO`sD^^hg-)#*RQhXuA8yVn_PMURp2zbingI(1An`X0ME#9cn=By<20H z<>jhgQMUZn*@9|t@`6%_r^`s|jK`&_WP_)Bc144fduxT@+-nyD+OESF@aOZDZ6AuK)jM) zULfNkz3^K6L863Cj0k#2W3XUVOy^!^ctOSEH+p8JhhgTljU~rd-37nl7LA|WSvj7) z9&YzM@ylZ_Roc5_x=ynPW{oZ@x@xsX1U94lNAgyGcrJWR7QKKB-Tb2iw?Bd0RGVm_ z600#uP4U~3`ZN?~zJu@;IIr>`Mfu1Y?t{IvF>A)gRuh$W+nJ&Hfdr%hC{K~?ZC(lS zS+3S)kq4srGg5TagrH~cOGXEoK=4R4WaqF)HM{m=A@nRIm%3Vu4_a_#HK$7afN-YW zgXF4qA0H`xVU<(|F}AK;K>nCDth1SzX$?+cO2PD2zC=EN8X9N2Tn?MFGxDVv$EB&e- zM%S9%e9OJhdc|_Sc^1K{7zok08ttE{_+%|6Bj#|xmhzwtrLlthHa#_+5Hz*WGxqHc zB5-jqOtpVB+GgyYMccK2qw|>_<+}lihf{euWBcZ}5|0qh>x7$6DCpe-7!HAJk+y^^ zw3{TFRWo`Vh9pJUh%9tkyaBgc{4&~b-(cFsmW3T!+n=>mTq{DWv}nQ!d1U@d0zxVi z63a-1d1AD~%4@LSvumR3I}jrrp)rTCxR8z<_pV`` zicKD5$RXO7e{r1_r(V~VrCU1g>#-ne616gnnE&cKPM?S8oNBB-8~frKsgbRLP288Cdp=ox zKAV2cUXU1!?+-THG%%OR-BY1oYu`Z(saxQiZI|x)HFT$rHmR}z;b3{#)qLyJaAo8J zS|j<>laCxw^tBBQU1L^ub;~WDQlN-y9BlT(1?o0;gD6+Atzy_muLI+h?!NTuKA(IE z)FIW|Twzb)q)@)d@j#BgjbL;U})bWHLc=t^K0HMZBL~Tu^xwa1rMMdRPm^P-+DwCA?npEe(=Vf2Y!;*%G71iO+0= z8kfy99&PX=2Fh$eTT9b!Pxtse+~bgLJ8Uk2JX(P__8ng9X*}KYKXNdir`XGw46@OD zZT>D@!H?>eS(_1<|B-o+N=RmF@2L1KNSZ+cmWdv;v;t2Z1E;h-P3$?~1B3oPvA2O=*rh$#BsP{fJz5~(>rlgdsBvoN*8@~BCI-^GV;CeS= zV4qhj1RSea&it4Ws4RYckG|Ufzv~Q7Yt_8rNt>n_G*Y1FX@V>vVKb&MYhY zw>neBcS6ly^#dsi#**;0wB#PNU>Is|f~7%m-W{qkJg4g^r6&Q>CxaQ?s8kc>3!F9S zSUa6UFmv1Jt$X-pVWcYtRp6d|I6dXUb}lK^g}0?LghF+v^lqa~Wjg;pmRc0lI}p&U z)^hljb;X4jxg~`R-ka*O?|ov|JU>Z|D!kI2FJR##(&KQQ4y<*&C)^#A?;D1yU$@#H zAMdPgJRAb%c{o1M zI(Xj|IaAW9Ez%>VHx?XR$OWAd;82YeE-trj!Ay9h<0`I|4CX5AxK|cgWo=|L@?pZ# z`Et$mZ6w{L)9pIE)`;VRkVGt+gn@fMkL>nlC}& zHIIF=K(#9q_7JwE!pobA-r{0a>I|YDKwC?PNWb!6l@@NY;%Q5>=RrN8lvv0P4Y)BQ zB-L%S;6}h8vnso5DC*{WMx^&$I6tNE4w=lf^q0hnw0#_#+fuB9dFdK*oA3>`UcW6f zBcCJf4n?RoD~CIz9{AB26H{!UM$1UmlSQ*2?(x$on z@Kx%b8nOMBi!&v$im(nNdh7d%i=C$iN6E?YD^Vsf3R}AfGxt(+$<$Vs4ss;-)GQr1 zeTa+E+ULN(TYZHVf63itko1D?*bQ*SYFOi;Yis;?pT8c*Qiao4&RNxq!Rl_?LD?ve z#`h#hmA=V(#`QZu1J$>sT3b>F{@++_m!%4Ojh1SQncF1A#6_I;XCasr& z01xr|PdebM9A>X?X@~D{b}=HW{-{pdsvdKPTs;YXyyq0v3XGgIamHrf4n_5R)0Mik zgL>XE9J*YwC7e_}TyYik)Jdag*|DtCK1B-jtso5M#bBO0_xgE=k*zYs6TXcoPV zdL~)kdnZ{N8eBIE^L#>yHGpGao6syXzQKAODK90Wbq3si-a?m0GN*T6jZMRYNiPPO zmO&_V2ZdV$?rf<7qka9NJU~&ncRhuA0UPM)86mylC2}%wYKIX=r?rt(lYjhNOQgML z^m$S^#{)|EGaiomAzIbe!1SsG3#pvZ1P|39v7m~TebE4q16udSP;=v)Ym9Y3Q>yN0%NDOyoGFRkqSjfg96A2mWNpG!i^CYh=}8Hm5*Uk3eVzCOh*n zlZH^)5Y71b1sf&Y-rmq`hpA5_Xyh zez9-f$(B*tE99XstA9HGjl9qS3*#Y!B}w8WpI=Cq?Ht_$JSSgb0qnuMB@GmdmDnLOtay83u+((vf&0c-k$PYpy( zp{Ss41vwqL5Qcq2Cl(G+NtHsJSqpk+OVV^>-z|?AA~xOEEn^~Dqmx1o*g6ijhLK-O zyIM_TE~~i>>?nq$R3%$<XR(y*A=%zHQAFcoci_#FJQQ+pH!k zTyRDd=GesZ$9xx?_uQ?u-DUGW4|2ww!?@%C4tRO1U_-Yiq_K=WHH{jR%FINIEQ;I+ z=ze$)$ltpaz84C#Vo(!3j*h0W;)hw$XRlYg(F{`o-HzIUD6NuX>e673wc?3JF9@?d zi%pb0&L{}v$#pe8_lY|_CTNF`0%BDMe^=@*ULN;t(yE|9k0w`0k0pixcksfbhmCg#6O){BdP9RUO=3bh|6OckX z4RZU~;0$a3#f8-RGIHalXbb+q&(=Q6y7Mn0J@53G8sKqeWJ+mO814>eLpH zz+J!YC4W^}2swrCT-hzAFq#ecL!E={6mXL!KJzs#Si%?di2$!{i>Bc>obM$sR@0kg z&H^DH94_=_I+KHY+{FU8BCdqveINOozdq2Is{v)R(}4ELuSi2v4r75D;Gco0j=+LoPO*N|4IZnNGuv| z>#@TfgbX;4dCYR&E0&uNG%AB05B6c%k$&tK58-39@PnuOZ+9e*yv_oy0{Jf{CPR+! z!G%s{AfxO8XzPtJGDjaYArdBO&m`xN*Dz-mGI-{#z9#5crnz;)dFn@{@B;elF2Zzy~hBQ7O(M<^l!TxC-Jk%%56XkS>5vH z&)9D;9PVP>$^ep2&iivjO>{;HG-AJ`?pBj$3-5Wz@1Y|M>P_@?2e``AGo_o!-72SG zg8Y%iD!{4K6TWhU2=urY&=YWFJ=Qcly@`uKx6T+RZOx37ans zWkSP@^L*Wkv`m1D^;86cYyx6YUZk%;^ReG9n1t!GAf;9IxF3?vm78dj_JhPf*QWXz ztvox6tWzN%E3aSG<)#K*9A-yqtdxEuNy&!PhNE7=YeP}K%FoBr`JkK)H&ou#kLA%j ziKqv4ZFQ^xZodSQVH)IU-}9GmBWx1N{6DUh3;ER2-+QvAwA8FNFf+3bJMDVa)cS#| z8g|o3X=I58DY@38re{_cQU>c1?TziOqj~qfx!rR9c?fDy)(1eIxw~NZRy~k>PmjogG?#;qz&wq54iq@D9q1%--lO2ds+6%(5@5YmO}&#LLw5DzsSK zlU}TeeKE%u5k`iylgmW>pEhljl49tOD16r6);o1BhL;O4SJxVF(gc@&Nhak5ye#&d z1WMjkG9di`FqS$mkKR29cBcZ^M(wZ_32db|QJ(?xNA}BBiyOs;X9!+{1e%_uVKwPx ziIuyDA@@86IyLNXQ`Xt3NKWeBR%eYNw1)T{20ORG6!~2p+8s=){1zfCZI%`fyW02b zqs*=b)Xkx{>S&>3dsc&DW%xjb(N(znpQR7zf8EmoD5e~+e z9S}C=V}CfOjz#tHJlJMi!Rcqp4{~OSiqmYoTbJ#UIIhj_gaLM zDYZMoU^z4-B`sv}47>g+s**40T4faq@egNr!#PJA=Fz>6;RE@qc4KQahoyn9_bf6j z&f^jXn6mF$`ndX^N$U3SKg?qHRc#A8dXKi_Xa{Hfd3d^ICaqwT-L!&52E1!`U}uG` zyx(2NP3qhjv^1=}<RM_#DmBirc!j+i-ugwJg52=y>yxQJLN+D;_aJ=>SNL!<81H z6^T6ORHq8@gQcq@EF#61+h#-+-}hWm)#+*u+4FJEo`dL4k6D;LL|%5dbtqx8w5+>q zUW%g5#n=!uSGD{mpp*`4U#Gzm_M(~ZK=~d;PP>>EpaRJO%Ai~>>ypH z(dn6V19!{S($*0F4bBBw=@CakWArUmGz*)eX|{)Im(nO?;2Z7j);j;2O`9)!ec)`o zWEa!Mi&Cl^N5$-$OtHOnt0+|7u$R_cw$#$doctaKf51R>W9_H48_U(goQcQHD?2p7 z1Gj?qoe9O&2h_1gGc;1bCbwTT6@m1oOg&aK-*XU& za8q>I-`~9IdAY@46hmO6Vb`CKygMv8hTqpm1v{uOynSN3kTthvh+|&xOKO?ft9G=UJ73)e9et>#{}_I^XuC5>QTmeA$t& z9^gH;zE{myvyCki-Ao??5`J7;6H$q%WDlK*%9RJ(efFAemetYY#FGKH4mnrPC2_pk zV{XkR$F#z%mX$xuOl}WfEf3-k;(Xs~W4WNKay_kRT&-LAR}r*LCwM3DJqBl(cBv%6YL4Rlzm zo)Ka9!Kmv^zK50*?>NVThgJ#FTVhs`JBvPOY+Hza2jW_~>P2t2`F;H(DVUdKt6fY` zCd)WO(YWL5RP6fwgID-87MrdqtXt3SEZ!`)wgw<&m1U`G*}T))OR8vO5!oT4K1kCe zFfd9cyU~e<#LFc$Q*+==Q@e1_)29gWZNI!$w5{uEJTCGGT4>Ou_g>=9W4}*+*|Vls zmo^N#M~Q{%`1U8#^OnYU+vnh14@!!|YITZL{z$8tS9~XNZU>}#7ip1Vx5}_pJXbrP z!3aKlqN9&*AL}K>=G3N4d`L0Aolp+=75Er8`^>;7b}aL*PL;^9ZDWi6;-)g`ekqVc z@O;F_@*`?hM2se(Wu1evsfNiWlGWN?2O;-0AjN9|a-P78o~^2li77Gz9QvIqj;pf* z4mRlFVJtzRj8Uc7-gE}i3=}&k4(!>OJK7VhS-?`}!Maonu%u^W3GepN#V^DNqjYrz z-)8rV&~8EcLiCwFR_1*XMx-e=n{J|Mqh_0Wy|<0ztbI7+(U)@Gl?)_!7$Lp4+0q)g zXz((}rpCQOlLHf|aZ!S9X-Z%TqRBQ_A@c+%>(zIuR<}h7XH}0YtvB_;Z8idUEH?Wi zUM?u&@<=r_?0c%ejyEfdD26zqMsv=FJGAFhjVbNi?#i`lwly%Q^C>?~khdS6IyWd% z5;pHHb!zP_X;s&JEWGQJ)7e~ff}W%Iw)0G6?3eU8Em{10lsR$;ZJvS_alt?sl6q6)nd~2P<<@kiT?C z?BN89Gwq+M1VaTE4F=Sb3pqN6$&?`rkuM_84BTaEex)^o(J#m`!OH`i+Uc?Rc#=&^ zQc|-mCF*dkm1~V=tWHb{3~98wd=0b}kQh3q4 z&!K0leFmp}E+u?k>wW?+JzQfp0T~i%~K7ug9yC@N+gMB!E zAe{=J9<44p*Iy8b$6^G{UZ?s45VN#groE=e9#d~hLz<} zV+r(N>YifpMY2lqoE-|G{&T~nZrCBI(8=phSyyq00V4ruhK>cp4v^U$QUv2xlPM>- zu-QbI8`)lBR#WyKD9;Z|@A1)2^^T}uKgoEl3ZIlJPSw;-B9P;s9IdXU72sWOd{cxb zUcQtC4VF!i=YnbwA;V>LK_;4a_Uug?Ino@^0*+NC z-rIe=3yel)AG2&X9$Mhd%LLrdn{w7;U&vn;bX#$_y7{X6y)8MIx@})Lr#4ri%4Iim z_$j-nhcRTYLO?S2)05jWpG`(6ZOns|Jad@1Y_YZ*+?sONzHMD$=;>5&cgw?Cb}}K) z7_MtW%8#J(Z=Rn;j&3wpX_crQrgm)dMj2uN+viNz6?E!|Oqc15L(R*+zKZ}BgIl?^fk~6fB z@dc2c15wAOLq&piMT)p#qJM%6;n{Xk#R}s+=}fh}&o}Bn3_lPUMb8E9d_ zklFJQiuQIbgWIe~Zy-6k&VR(yI8*`kj#4>WT#*qd{Af7}6kRtYlOcCwhb9C{PlkM+ zzs@^Fgh7(Q(KmQtg3Fx=Yx^5mEsI17aEZ@Wkd)7OihdN7vu)Z{4CZu`8n{%Ib4Tgn zcG^;__-itZu$+74pq8iAN4=eUzzw3>QF1x2Me@-;z-7>{rCOd>1x*6u2z6;#umh28 z>ag_QLcKR<6T%k8@+xhqz%-}S6+bzNc}kONQ>h~^mtU(quD?Mghk0W^m~+?{OT7Lh zc*VLCc!11mLUI!@fl8RQwcgp1%T0JHHcE*rriz!k0WDFzqlI&#u<(pJI51RV7X$rX zd-pxxJ419#tAqBUML{7)-fE(?;>X_{FPrHJg{Kdsx^_fL^ac<#uBi2g&;w+S;B*!W zR}h#2f@Q5wnXZ^uKPH0gJxZSy)0*A~vR*UKfLh;-BIZ*iU8Ba#z^RloGZ!YZ5vpIH zvR#~%(F-evAwVTn$$7c*>!1+DW_a{wldG3mL+UBeC!vdG=*zC_>uTs!Cv~@utdC2! zUNF_uiGh30sS)iZOlT2hp4N#VOsVIjd6k-5bCE^%n}otoortf;(7O3-dj56f=(KHsZ+sjJ)d=ZJMvmS zoX#ynn>{?ZqN^4J+fU%<&V4dD)>hp)OEj)s+c8M7&N5*C2WZuL{?x}<*3Ikithbxm zoXlsCXAI=H9BllClxz&+yf!->WFZDo-UR>R&^^~v0}Kn3bw+&??%Aic-9RjU4we+K z!*^xMRrmsd1mDW#M}DLUl4Xu;u(H9f_jIDHlo;MCezH9qIZf$;DNvR3jffsZ(X4!t z42gPK#$RSuH0-~xKS&0NMC=8mF)pntq8j? zuQ5{yKkv1u9d6BMu{=^#HkJ$z!lM*P9{CSeT3^TN94Zc4tAXeqtyI6MU9TrLL{W-P zs-C+E)R``T1v7p*PSByDr&iCpE0hH>eq<@I@t6cJA7!F%^M{>jN-m zF+beWzDGStRL}XK**Uv&WJqILpw93^`g9RNUK_Xw8%J|JBbRItF%Tul07e1FupSbl z5hCGcpra9HesFY+w2meyHEDl1{E>OenS@{yhSbaS&{%O;UZ_Q>npF|(%Tcz`J_mMl z>-A<2-6-9bHwnIkoq>-TX{epJ3H^i5+4c)QxAQGJ)sP4-WbiHGinFLosrvr5b6-&g z6D3rG_BK#(P>nRcBI&Zoc3K#8ypx%!MJYo*q8;q(lU!pE^k;LQ0R_0?+bEAbvK%}! zWMVb{t?`rL#qG%iwjt@nm4^)Qmv;}?#XUBr66Y!1fn=_}{S&<^AtbP7_g>XckS;yuQtkULrZuspYqD%m)S5(a4tWA9gb$=lkOEL5R2P*JQ) zWpAP92x5`TtSuXkS8+LbRB}j|3OY$T{EJfJ{Qy6cmd6Oup3Nw;ld9g3SIzTwxMxb=t9iYba#bDsGQ^tXp(Yg&DKmdfDBe zPpzMU`tT|BDQPdBfS`bOs*x$RvL2G7JHhsSYHsABUvl$>>)J>s%Q~%XyjsVXI#b>h zr6O7X40K#ouWiDX;e8yf0>iIa)6m7pIy>g3BFf^SWT03%& z63AeAT3C-af6+?^oVTKD7ZjgoUL7cyOZB8*kPc&V#y&}a z^%)Cn5RXn$N!_{M!G^32#gyI55BQ80bg6zPdOAFAl?zR8wcN|myK&RHp3SJ~>jj;G zx`GYEK6Skd>t@xPXLy*9TqB%b)0=lYs(W{}L-ci@C+kCx{CVys2FXSPT`t@7j8dn> zVS-1E`7=9BK$z@2Q#~>AH5JC^`Z~Gxiv>z#unv782@JBSMud!XX8FFY7i2Jc{Itkc ze?_<&N5z2jC`$t!ofUo3ZIYNu7xtKfk=B=piv?eAR4d>g;t> zJ1jkS?tuAXd%5cfgIcB;R3(7WxVKJP^#?ujF8Ycy4yak`C-ho^$w-@WD;2LACFS7PF1{KjpzeaTwJF|<3cCM!hyZZrVTiw>^ z3K=6cJ!VQnT!zP>AsIyJGX(oq^rg1#NZ?bLJMb*yLyzcL+g3OE=qPVItdWM6@yo5u-qkj zI&s*DK?=l&TZLXO1SR6>;_ggm=+Rt205|Kno6crQTmc76FueJj%K9ngDSsLocbNo6 zXI0;p=;?aAmPUAbSWkF2LKXhyn#~3Y{?Nnd@@`(lKJOzoXsl6FJ`*h4Y*u9M+hO-4 z01B$*P?aD(92c?+FDr!|ox4he6lA;sI_m*Cwnh0oLM>g7Wi0H*G~CwMct;BqM~INV zo3!*RhqB0@HcX?y3`U-ksaiQ(-D^@_$N|evxc8-2yVNfM&5oo4&KRkVq z!&dn@{VNBc4j;-%20fBj!|rpNeBkA&<}`Rx(BBBvm!6uX0t;Q>Wq&-MdYu70aa}A? zjl&F;W%2&${Uvw8dY&^SW^PH09iIPso>}?SxV1nmg?kzq#HSCaBNL*5wr&#LD`2Du6U5{~e$GU$5()Z|4N+_CkrJDru!iN}^ zND4L!yY8<8CD{imX+FD?dW5sI`6lRIwy{$Ga-A`H8QmkKO+hDVvR?a??%3;kswzF~sSSyMd zS<@W6y}y4R^5kYj?;W7OAN~%IfVIefMz%6rZ*pKg?RMu;r6+FL-)>}a_}}U{ z4G_a92}B9SI|0qA&mjlK1(vFiV_&_KUH?G^6_DTtR_JdW*d}2kf=K3tGM5{S?XOy! zJX1hQkl`8lJV;@7zVQKO5*GCmuU1Y2uTR^0Zm0+NtPw`C?pxIBAQ*fCwy1zvYTsd9 zm}D8)fIJrW=9!B>cqF7$jU&njz>WkdB-r?DZ)&Nh>&vu`s;W(5%(<|=fC@MAlkt14 zywsj&Fs$kWXoMTT!nJnOzgn|9NwaCk4$@!?imioQHEv5jLJ`Z+q=C;V3}=7SR` zBDd(p!YP=nM9d))s8@Vw0}SXF9{{AFoIxf*SOI|NsOs_@E8etZvY3u_xSam;WDfGW ziG{M4Ip2}N20U{*oC0|UPdKe+=b#V_MX*C-SFW#*VsB31&}FrB<~F92X9y30Me6fR z0h^U>yI1J25`#!7*ZCC~Q;;TzPPdB*iI%OpMT)FMe2~d%{-C|f<;bzLMk)%t4$OzS z){f0N$h-~W+7%!t`z}Ymqw1MACHx6y=t(KN+Zh&6$QJV>g?JYEzuyscIq`5Y>{<@o z02!oAdpz+ttJ-8MzS`ie%sXj+DRi#@?+_dx;b8Qg?Z*(o=9nC~t3=8u9ZKwgGr#ip zOpao(JVGs|Ymsu3mVVvPK`8^gCoHHEi^-R+R@* zKekgwE%O~z<>OHMdIrJ{itC<+jo^wd!ZgK-<7bqh3OFLj>}0{wH*)8Iz6vFZpF_lY z)c2d(Jyl479-;om7lbby6*if(-s|d1%&R9dV5%`fUH4Zm07zA#PMi92MGJ7K0#OU? zjfulMzQO&(-?4F;2x2L(XV&5v)*nfPHvy>m2VT{Q!Ica>*FZ~U6XN7kD~MGh2qUTh zNcMIPXtqS2un!^`5@_tjA~Tim%7+c{$w~O}E-f)WzMN)l>66d+-o)#I2m^$bBr_85 z;YCl?FL5ba3!vCqIsM-FOxUJ|4YTPxKGRr~-%iW<2xDwalzaYFq# zsDLj)+Mn8t9(;KA8Ywu_ustuksJ~YAb8$aDPNxxL zc)WrOIldC`J0UphRH?5xXO$>@mij>i5s04#*^Zw6Io>ZHryeQTUGCrX0sn-J|{{$jB04jU<-U1@wV!!;C8)Nd9M4}O%K5nsqU_n41lE;SH{ zavJc*>&I=eh_QtiS2Wjj?|Qw?JLRd1c?C0|-LzETv+_PriOXWz#t*v`jGZsBL)@A= z!`ermVenc>Q$1FTq45I%HkmS?viMN;lY4NTk9PDaK2&=gdUZaLBM*~s;kV&d2^$=G zK27=UyS!%Duu2V#)u-VytK5b{-bSn2_|O}UAoh?&HBl19(-luA-0lL1u1DS=%c6Wl3*O_V8t0l;6^uHtiE^y>*R(@hSv3mfpI&8Ii>?D2)r z+Cj3dXENHx9bQk<-wrrp>BSFYMYaash@e@-GoVL{!WIBu{eBq#&&TN%2Czh*{g}g* zDqnsgDG60m3~1N7(U!J&J=l%?FUnIsrDlbi`h{+vy(0%-Yn~0vPD@(bPXu_b)x7ao z_RmwR&o)&Ym-XG6`Z3`(hwyat)tG0FuUeeK0KwWrgdqdm2=7FGj1Q?&E5n5R0v@1^ zO3&$@L+&CPPUQ42r1|qdfI{`}w5+IePP2%yla^%b{pJ9W!D7}>&RJiDIdV(J$nZf@ zLPQvzM?l7QO7*}@$v>jyuY*nmvtvHdK)F>M!;Q9E?84U4pMIhOtrg%(7-W?ne`kcsO85U`+Sph251z z$?@n^9QhBF#0pQvW;cmoLyl@|IRC-ZiC^P}_bUmY{md(&M+(F&@_j#{6{#QLQWVFA zOu55;8ZSS1wnqK?%B-l)N0_08rXZkDfPOU1mf^&H9iV>x-1n39%+1|TZ7A9W65;>aH2j}L zkldeK9GK)}^gc?wAQSQ;%g8T_`-_54njDfMr%Ug9pY83*jeyTj9yGmzOgojG>v)&g zlBMPR3;F$mN@p_6)3md%sD`FEF?)e2GL0`nk(H5)OnmDaqQ9XzA{gP?JrY;|wVA$g z@G}1&mCrf{yeQU=Ds8!dOT9s#vj0ua#2|hO`sfe{9)L!ush&;J18$YF+yHI*7xe!1qDHe3Sp z6U&@99{i^F(e&gb5$2lZd~MD48yun*xHbdu=2x%ljQx8Mpcrd1FYbyb@<7tj5%5AMIi%P#ss8%*p60}RN#<3e^325-QL1?)=lD`)BH*x^I zQ2OqA#=x-uou>-Mw@^-D{yRH9Ck&=xElrUF=xzr4Y5kmFREiC$-YWhb;FB%X?kXhZ zr$hD=!Hb?q*YA z{1pGar2rOAr~L@aFj+^S`c&NeZ!9jluMJtgowO9D7U}h(1bJ zc<=3BTI?>TW(5j<4=6fPbe_76XSjPF6Lp3@d2T4%ZE36m~IrJQw@_WB)T<&Ai(Zrv2LvI9t z_%F6~cf0QAwKxLFT*eB@##ng=F+#c1?xAJ+M2=!iaJD1FUENw7;_59og4Nb6}E3 zH0eO%Wh(zZlfY4lxp5P8G2yhZPlgn-_kXtdrN*_lo&D3K$dc8Y|1GQmcJAKXH2o^a`iG(XAIsR2s8gcFwET7v9M!#jylAfP zmgV1a;vcE6il`{K`20Uhaul z4AvEtRks>O{{7{zPoB_2qlBMbH8JM*0-dYktPCqu%x&dwo$OcQJ6YxQ%bIs&__M!- zF)o#c{nvN?#sQ$*wRz~8hP)-hkB0w#E5*yC9AUlxM@Rl=uI~W&O3-39+kZd8+*rB} zqK-?2=3l}Pc;^Qeb}lj@zo%dQYqtR?uc&U0t^qvs!GGJ#Cuic~Lr6F=CbMkmx2Hnx zXg7xn(UT#rkB+mC9yGQTaio$hbANdted0we4v*{A1)A~hs>1$p`utxZKm4K} zq#n1xfGB?cV8e9_woQCdK5>I9O;@0 z4dRDK$(Y`pe<+=a>S)w@1<0fy(x|aUr>flff25HhY-=@*5s7@4|H*DX3`~ktw9x++ zEJkZ4MalCoLHMy#;_&m34&_#zX{ZJ>(n73HE%)Ns5dq z`t4azJd#H1YL8AWguMORclzt7z?r0UQ##6`!u)^Oit50m+oQeDzh{oIT{AN3L8tz8 zqJPSxm24JiTy3}Itlm#dY|3W0RzQvCc#5vY?gkzj1bVEwEFaeUz`NLFyrs63n;lJ zMRxu2?LWYNXMVwi6e3 zApZvA1jf0gPqpk&mFcC{tH0x1;j+OB@F^n5?n!L%-{YK!+t>iKv?DCwH>&{HeDLN| z`Kv*TlE2w*4X3V?oCv7O7_PPYr02!IW&*@fxa_)LPzEt(>-SrV&UOuJ+@=2gEW6f| zCwX1}8sS7%1<$RU)SZJO?lb?#Dt{pk1piRic060RZ_skO=&9D$L&zgMZoa zTn}3;!H@PfA^%$9$&lZX>7fhIRmlJA>@B0>TDorG1a}hLN$><{tZ{cIxJz)C;7-s4 z5AIHY1a}$@?(W*SyEG18lk?o~-ZAcTe!Q0--D9(*t5&Tw*Q{Bxm!E@S|D_<93k^;k zX0TJxx4xca|BKO~zFQtF?DMa6x!j;i%D&%ar7w>POL z32HBo!RL4XcgOan4WUzE!j4_I8R+Q;y(0i7%a#xNtz0ANIZrnn|MJi%^QoP0?=nV- zI-VDq*@E^{&@Jy>1q5f(b6Vm5rQJ3N;dY^-lg#HrSrUG);73d0NdLX(Ywx#SR!XG2 zF74p%f8)#65}foTj9*{mh`)*L(v#ND+x`>5By4mWL)pKD!x?l;kUuUUwRLkakx}-x zcm3xeNpeB&j=|jS!FBWXikHpa#Lw2~Hj8nJI)}9mp>m(6hg+NeSn4P6#d>#-Qy_^` zdjNdTOTTagJ>w<6U5M^{=yTc`PQ%~z=(ob>X|qVWsX=WSb+*L!%n)wN6J87!K<$SL z`#$DCXv*Uyl5ZNbMqdE*-$do=tuF#XpIWIlQt@n?@+a9DmwUeM0cWIMI%EocXzc!} ztCdmcP*6}{NV9lo_e}!$u9w}w>^#Qc6YeRG$v@mL-9~NF-&u$) z3Z5-cMIImB6VAhK%r)nq@r2!5XvPj8bE<&$Sx+n)Yh{5xvf`~CqxqV{TJ9>Yx`Y+C2Ti%z?Go?|c z&qfxQ!}i}=4vKX~c;jd&{{>p0g2MlW2mi@eFR<`m&p{Qr|1OLCPj7%qsQ&wnd8XY1?s3?F(^fh^^mJUU4Wkj)}ZzfrGNoYKZx=DQeEs{n#r7w zo~78+_~;C*_tMhw5Fox9qf;N7%E~rgFZx;j91zhP>`d?Jk$5^GA-h}bJz+|;r##Y8Q$w7`#GXKmAa*^U%G zulPr#2VJ-+CULt2Ups$@d38yN4Tn|PM=eo7>tyx-({H|JH`tIJjA4w&)?V5w5w)t2 zKfNX;UY!IR$)e=-f^P1+*QVpX@kHH?X-^1=&(K3b;F9l9?>C}0`!4$6l2XB*|Cs6G zU(Li|m*%$ZIOAOP^yE7O<~(iaceAK((&}ssX7E!N&{47lgzc60n|G2AnzOe+cCM}$ zPtLB~QbX7J{?}Z9_)6TIoh>FhLtCG5(zp!GVMnq7!(!ebV~7W7b=LF{$wgFZ^u-U9#_vTwaOxMW2@NE!sA zc65h@e?(~&>NmMi7ou)7F3@Qb`!aNMnepP7XbaTv<(8JyP#6DP^7iDfLk$VLJjdWN z(DJ55YV|%o9&yy2hE|r8ME~LqUu-FH9B@c{YW;^I8l5tI--uL_%6P$x8td*acdr7iKqT(5q%SE$bx=JGM zG$gzN@Q+ThJHon2K0D@x##|CXjqHH#D|xG2<_Of}#g{gej~X;GA9o;Z(-#>LJ!linnwHCmc0D{a-`ikb$}zANPQi~o8Esz z&sd~zX5OA4TU>5fd>!3y|yxFms2s}oBVhmt$n z=MEid{F|sYzgZIw#}2C*hYJ4$_MoN&&z!i*SODLs%R@CFLMqQOds_HXNsEtJbB zO9o_5D+(Pwa0k%<@z6Pnb}t&K%a#;}l{%p{w`Qjm^dcfNvuc(!FA#AmybaC~cz*22 zcPLXNk*(xw?Go8;vn);Wz1t17q<{1WUdhzIHO>_*I3y82(~_!oMTR!E>`-goKj;@~ zfp0b?ehkPOkw7Ch?ohi(F1Xj8+u!+C^|rdhVVX}e%6Pvn{A@{orpgM9*s6tW**G?` zX<+WM_nX9s{}VS>)ZPXOykLQQ)C+(<=F(4T@d3l+(-TH%1UaXq8Y{Gw*~*=!>GE7x zg(Szw_ZdQ}*Nh9Q9|(=-`@U7pfB%&LeXYYIyUqC+gV#=;hg@SE=STYR0|xeJ!aGpv z2T?6NurRS~Ku9$U+xh(E8Ksu%F1SGB(u#zw8Er2ml)-OiQ?XYjnP|I$ZpMyI34_b+bzwsTPq!P)b>)(2!=at7zm*}*k6fbU) zsuW!iU;NlCBXR*E%Fcx)P?!9aoq-QRT^T%f^(2jh6!I~(UF`bGIr$BI|7POG+oUzP zjce1rjW^>n31+$HwbEQ05K*68Azn0YOs6dWo9@QRC%68#SMfjP-~CTEP5kb`vNXH|7?Rn^KId7K_9|8>CyDB}t>@?6`v{v!s_UCNU{ zp{hNkt}^yRr`C+|lH-voml<#e>4gQ**oDk-60?`onb^#HdnxO_ob+dYsjJPD01| zBuAh|n`qJtAZNRAQx!;_(82%j}93O?t};>^T$WJd(#b$tY<;NAo{~+cK%8Mv)v+jcpGRo$Mo@r zBTi-HbGso>S1k1$1sZ1#SCJ7xqi3{^KYFFJZx%&M$6%j?E!8Oq3gLTrH9H$;N+q8! ztWHMKs&EBx?&g{EEwcK*BL|m^9l+p^{NVByA*?sBgd=7z4=RN;&LQ;zA?thsF}P(H z4S%4J?10y=bkXr+f}aM}yv*Ci2u}HKM+%xrsE-z@$5=$$+E#zr7&Bw{!~FIbIz~4h z_J_&JP}?EtkNUL;$N>wwCf_be6{wcFB0oNXC?j8!WPMOOcsc6=%|~XbwX&CSHuQdbx zh0HTkFb-paR^Ni%J#WD{C>S7STo36zNoH+^Cgj&2TAZlbi5I9#7rRebh|Pjefwet+ z7#ZN+&RY7GC=U*2vMR^9eZav()MxIQ&qEs|AENi>0je}q;aeqpQO&b&)zKBoU2`U= zIt!{(eW90qpL%o_lmzr%@<6dS#q1@+Oz+Tzjf$i%Y?%dWxte#kpRTrgvl2he;==yW zAe$_q<@J_H0rj!~Z}i{ZJ@@0TJSHEo=#46!8dq6g>Q`xvJlmgm3KHM8J_{yEiXv01 z_EuHeFzDRBV=%UCwq&3ml(1wVHvL(`kgx^)QWc!4*ld^i#X$eFK!&aptK)XX$(+W? zoK^66C|`au6aNG;>k-Jmck6S^f1O?q>&4@Y`I}hW;xTd-egkm>ERk@V6`FABXZq~5 z16+v~pNL45wMu2-lPN|0BoBDsy?B$~gK`6-+InT^Z2jkzr4_$*fUBw!KWXP4VuFuB zy0QSwh36lS%^FF`aUfGk;Oq1Vfo2ZFAjgziNlBar7GNIA(iCvR9Y;+yP4wV&)0EWH z4~>~g2>@@AZXS>7k7CskhBuui@+H2)U8UaZj8Q(PK2Ai|Hg?^%dfoPy9&q>v@pxue zYT)XkG$C2=()U_65qfmPwuU!F`4+HP;yfg{~Zek!|82k{65oj^aJp?d2c z|GnT7fR9B{bxfdYw3S}O*Pi)a;3;>2690Z%+(Rw+&JMk9hL9;EHJ+OM$+D0l8fzTK zBi?^ork@&i*o1E&8x=J+Jh0tdQ1DRXCpq?{omcj4INg#PJ+cfz^qoSsgD*ARI^Nnd7`o$_6hLVl46 zQ6a)0|F4P35Z%w5=3X7aJCSe&t?7wcUHPjx)VdCMzk|i_EgC2h(8Q82zA+rZ!WI?x ze?Ubi`o@Ds?P>4c?xGm%*iNLcv|=fIy_B4l4w6cxO8WL8NeuX9OM=X*5nJ`ktFYSM zsymrbZ?Nst)Vu4(BLqj1#(*X^L96VKN+(T|lbgszlL|vy1HQA+WzD7jb%c)yWN|B6 zsBD_nGB>{C8CXmMBH%wvf!ksI)cnJ0ap9U;SJ_p^D|lyc999cuQho;T)1VyIQjUc& z$w8VU(V7(Y2KDMFpbJ3!0)dHLjM*@b91C`&}nY$EZLI`T))5rcW$<@YEB| z3qz)d#9f`tIgI)pt^DHKCAiQ2V?!O3e5($b#WyIAjNP`~26XZ;xKlyX0Up0Z%|8XM zH)`TUtfR(!pcjkMR%B!={DF-c(;t|Ryxqt6=2ms^Bbc1)j`pnrQxMFT7NmvD+G=LV zy;-)jqen6{?yyhIa$)!&R1FeaCVE#>s};0vCe*YYYuRA}cXZU4R>WrT`-F`=B5PTZBC99aoV^Gsw6Wh? z3W@aIWk##Z%%*2eeJR6s;Bw%7r8LDeGuwc z^XY9-+(*Bi6_Dp=AloTYxJx-$oS!dvKV(XLO7 z!_DSqU%d=B@!u`HYl4-ZhxsB5lm=j`0Df6^1eN=bM=doWHY3d| zzn2=#x=F=ho+&N68ZqQT&RO~cAus;HK8zcOY9JbqcqN*I zNy1wGZETU=ze+s>BJPYgpg~@mloKi%WhYPYXarA4pFM@iqT-h%j19WaL%SU&a{kgc zUi!MzINhjJ=ys9$4ieVZHZ1Bv{*9#a#B2T=heD-U+rj1b+Bg+xDM$B|##zVzx05?H z+I?6Cx8q{qfc7*gOfO2e_L6^KPfU^8L9a-+%^y|Whtp{K<+|r}{ISs1GyD12dUc`f%P{IDP<(Ks`x9n)Far3~Nc)Yvv>;v=r8GFjK%vo-Zh4XwUg3@T4<1XYp1_Z;)c)PR6SU(tmrtUcFT^cfght9LO`c4?V!Qz|V};yjLNI?qwrig+ zScz1oL4+DeIF_?hv&s;-ZJTvMqN+cg-RW!KR^O$uNPxvhM7lO2j9c>v*zLVBlMR;e z!`fH8GQRgwMMw>Gr<%}Z2XPfn?#R>e&t`j!1ufLSmNRkh@^4}aSG=1Gn9+yzeCu!5 zlV>{SJq4i{(~WJ(FG%?zDSMp}g+Qi}-FGv^V+-E zb<8n<7h1J5y2BTrFjPZ52* z5hW*6R*H_pXp3nKjNi6=?95zgP!EZ6SN0e;@z2KRZ>C@$rlrCsk096i5l1Ak{*2*M zwBw`9#o#9IHL0_lQcjp`xpK;GzKK<^fAj@L& zSwqck)H)4-%IvULHG)^7h zu$if)?9cTh=}vQHvwpibsEXJ1S99$n*l!9@b3MrU8p&=0E*&?|Rl_W+lHeByfz-p2 zCQQ+wWPL`jej&ENV?d{VzNG*X^uTEvBa6(jtTK$ncJCh_Gy1F`^+9x&^SWb-1qrF} z%jE4Q^o8Q6=U#!J$p#2LQGRMSy$j@f6&nO1qwQXDCL_l>{z=0hB=w=Dq4Wvw#VFjJ5ysjYR%p zf(T}U?{M_V^+RgC=pw zBcGWz1bt4N&n2yxv@Avz!%HI9PXb6o->t2&`Q*c6tu#zqYmTHgP zr^x|&QrPK!yEOlX#Qre=H?=Ug++{;&#Y++pxz64W8&}}Jum)UMr={{1gcCHqHyIVT zZ69&!7smuoM9b})5)1@rH_-Il>3Im$OZfo4q}k!Eltx#1&N-3tfw;ZmP}}0wlryR167WBUMS2q(OtO{L&Qx^r7M* z{r=X-4z~%)*Dd3DC{^7vM)ZWdi$=jvta5`Sx_!(E?Y#-2EUX@@UR=r=9VD2=o^mhHt#}57lRC=kqCe0;aPA{Sk zF7=jCRU6{79eS!{1kJ#fDK^6Mal3xSR?6cOr2O?|^u70(I-XZd++ge>bPxCnn0?QA zKqB_oC8d94SzXJUqHLNHGG-4QdSTOgjA>2}0p}bamXj$7u*{H_dj=*#o=6I{9XUH) z*@tXjt_*`UqkYBUoo3_!DtW{}esvpP;{HjTz(gmk0i6KN?0d~`MD#|u+s)Rr8}lo( znJslWtvbQyY`Cfr@)fFV(XD!6Ci;ixMQzEQ<+{KaMLFJ)>)$(g(}uvKNzDY@!h}x$ z+Tt%f{^Kn4c+5(zQLAsAwi}{^J+u&)SEjiP{W01^Ey-!W)2zjehW7Rc!&j$|MVaoi z)A{cAjsbHDw>}>gL{~!fP$3ZfyJ|wq1+61BVEuF$dH3jnrx}QK6C+pHwg>F_ z0sEW!4>`KW!}?I>+W{j-hoAzDRoz4jrU%k06|`^T5s^%5K=O=#TJK#l_9Ujx7&kEj zuV`y8(~au@mpR5^Hfmt8bavos6KtTu;)X>SVxFYwXho=0>NXNW(l*0boq;Fp(P|NV zY2IrB?E5ZPHq3?g5B7`u&n$nM*$p3>hBFFoIC>t6MR&4c@3PL8q+Jj-_zzKzB$|uV zbFOH=7fhlQ1k`oHbZp}Rov+=9zPZ$I^^a0E;mUcanF>qQ+SSN&Dsl)kf!}Kb$d0SJ zey$=ka)X#@{j!CTVJ9zOWQBs_7U&b-Ai=vb%gecKNL4r0^wI&!JdfGd>&pP!~WgDW=S%2B|U!?wmE$> zza+a-i7zf43PMl3Tb_cFPJ|GnDw6?)%`jq*PhPoaEt_jfR$i6%zteW&4j}=^=MrOM zBvZi_#6BdD*dJ!`EnQ_%aj1=)QjrCSFbSVPvd5L06quY z4J^h`Eaf+VoWCI$L&$=pWltvl$5^O&tL+p{-vEbRo-6Op{YgX&M{Z$`@5{bm0)H|; zL%xIg;C4HJKaUkU1?Y2{I(BFn+@U*Q?0}K(3{HC#16OW-Erv%Ia0k)E8DDip)Z;^h zM-G(Hg&Yw&^mMq^~zsUZa1Kp7?nVF|pR63^G$P=#Mkc>48M<*ES-nEc5rF5SvCVH#6n}&hQ+N~9L z7IKyp0T{2fFY#wTaCxiibQwgn-m-I*Xxe|-pmBHdTrVLg7Q#Zk;H^yhZsfUjv^8^3 z4#KdtQrxgT`*M;#xnumP^KW~oqYkkU&YCqE-7O?9ThTbKv=J-zu}D_^(mn}wI`+%F zj(SbtJu=F@cou_@koO*K#6$rOp4N9JfxbZNR27`%i7Nfnn*7-ErIhE!X*9VL?-|{m ze%+NYU>Zw<|7^vq)?na>H9g{6HaUloR}5nCS)*c^$bq{>ZCdZxWlhqPt$(AEe@_w* zFgm0|UtBN_VeFX_ju-lpSVC|^Z7!<710BLgLBEV3pcPVI%fT@mf*1VLlispeYgl7A zpWRnqc?c^HgYe#B-+lBA9>8_r7>TD`rel>=l9n2)+rY+F3KXh#W6y0Mu#Z4gqnKF>Lr9QQBz%(LY-?}sud-<6-!@J!yit^KV@C98 zcj^ekId-WAxj$=1K9+&GqD+lnm{3PQVc9p=fUO~x z!STyT;0-@^eWac}oVsNXl%TyAMh@fl383e8gb}zeeU4B{Ys{2hfS@Oge>0-^+^+m4 z+Ced9N1|^5{L448(CZlz(4V|-I}54R6{Pc8E8SdyX>YDTxoMzs{dowb%iK!#wCt*jC8gvO`q(jx4(|mEG8A z_&>Gla}7tbW)*}3r{|`>tgKfk+KJ%P-aOHcC$`FYwU2z?Vc*qDO{XE(Y!HlB&AYG1 z7l5;@Hj`IhVRF)2oeU#SYca`ASO#pmrzTt0`5_InxhbZ&yq; z+Y|jZY16E1q|sYi(z2?vQEyA2o93NCiNRY!GB`Jg)VM1-Q);N;A)wSo%Z~K1rA70J z=Ub)I-S?wz$m~FI$X0p%hTS7Rwn1jZKiStpsb$aL{wwV7)J&atX4efL1krEXL;ssJOhDgi0p{9bO$9S5)3Xsbh`CB8H?W$xT1?(4R52N)~0K5i3; z`CD_2(MiQ@fNzwDsIp;GJPozc_|Y1T*l3O)VpVxWpr%^J(_%;N&r*HDM-} zc(0a(f(N_5V#p3yN#bE*&4*{rPC&2<8{H_ALigz3ywA{$9g{0<5&$v8O1e=bq4CKu z;%A-crnmInk4!;gyCi&Aj(j)I`;4@4q9=N47#u^_#+P@9I?|)NSZw_v6lvB}HAz2r zI|3f&TIMWtz5Cxx{uTS*Bsvvq-QT$jF9i=27}YA`p070_k$$`L*(A+oBfRKO-%ov( z;0xGhP)5tC*9o)ug5!EG-;5l6Ry>@cVKJC^v}9$z&eVgK^YOBb=FmD?G{iA@tgGdx zy$&gQO**n2A1s%vaJ1-K;2ENsL!e1 zH*XY%E1JN9E*sNeJ6ikO1Po4 zDN{D&SV@~@r<(1xxAJO=6Kh|@j4Z{WF^{Sm->U*cL2o&XKoeI=B}6j(M>xM}OHdP6 za4ki!Cb3VdW6U`!TPmS@yfy&!JVV*Bf0Y;iUD73sZDr$qkx^=A9vX{n4oCtmnr>Dq z$$BXXz=tE4sExnAE*p|8@gi&mBwrqQ(@8E1D#UQB{gTdre8_2%#4GgO&R549T7zzG zH*1L?qNx%XH?~RpGpwSG^)=(K zhuDX6J_#wCM)KEP*(Ytmf7A$mT{6K&-*g>(Lhi{PINsLHKc*`ML!e;U|5#a0$EK{3ZkZaykhCp&Zv4yTy|}lQn7~WvPhYib zNPfsB9d2W4kE=JDYJ_d~KhJ0+#6M%jWEo~-%rSzdUYVC? zxxXD#2r7(wTYs~PtS~bWHerYF>@{Gsd1Tb*-@D6u4+!g$sVH#-B^fO!jNqIQ(S{3T zstz7>h`0l1ZdK274?TZ;)0bNeRUYSbNAxeeRcbs1Zp98U+NCr7su*H{q2W))mo>~W8z+tJlDj^yt*U~~2YN<~w|1PPf^+MuX*`EV3$FsRX{%)Y)a19Hi zXxaNw%B)C%ZC&F=E)Z2Nx7HhZEy3-)6m5Xkc^cK3sS*g`#eVzk55I<6NC`<<3vuz` zM$RM_4&JbQ{@AoKgWqaoUXO9b1X+MjSC6C*5MZG-SvUaL4gZn;ys)Q+HG?_=n;g_B zQ)kFCzQ*BzP-)G+jm|0jko`z@HRwYbk7b3WK(ToHcYBdNsZr=HyLf(s&CGb!S1j7 zAnKaGxlVP^(B#8$rZ&L@H&+CVcCa0EZRa(G4w66Z-AuGjF26pITTh6S{Shg1PA5f8 zy~T=efYk+TiySy8v+r=C0DGXQeYq>I(S3mGbWCtv_}rkO#UdLyHU%q1Gv5*_Ikvn*G0;AW5W1zfEB>a^6g4Ve7R$j9wOuANrLC1&*h+_&ii)g4MT+?UNPIyTS?OgU3 zYgp6I@@5K=yt}nnQy5;^pkyO1xK?7lZx$-jG5&XrdRd20}E3 zZL#fmSS_tnZu2cwr`(@x_0oaJMp!8Y_BgYuK@goH*A}a~+MCItJqBrKs$0jvnJ7TE=e`q)kH$ezWIz%>+U?P~*L3& z!67&Z40AYVUA2D%ssT94v5qWJ^orhUfiuFeM7<$tmvr2Heq(X99=-irGanIfCCZ&j zM4@8_u$6{cX2o1c!PNCVS%4`AtHZ^p6UL-R4FhK`!HmzO{geViA!koIAW zu$1Tlatq>#v1tQlzVZ&qdiiO_c&@D7YF_9n;8%4g;eaIK+h|^TCBjRq{nSoW*6`Oj zUw9B6U)k#xKjf#>|E^f4?+vJmr574@_0HQMibrjD%0*J!aZd7qT=Hj5d1N4A*!TI7 z4Q1^2A~b%;3_`ItHi21=hd=QiX`1*tsp@l&t@TQvgE*haqC7~Q?8)t;q5$x)_RX%M z8dzVL*Zn>YCQ-3Sd$hn1zaqlz7JtZ)r(Tusmr-yO4b3>-Cmh4^aThQitDkrEbOYZ{D{)^+D-+-uHpwISzMzgJ_n_Mcs zp2hJ@4y4Sao)?$P0N2LDDD*cAa$I;Pr9o8>V)SOt7rQLv19aJEl=WX;NSas~_!!h3 zFnWGT<4fe83YkszdZ|k735XJB@ykhk7b-W|Es2jjbfe9-PaAnvqx#-_u{GoGKtZo9 zM^<9zkv)7FF~xWC4V2yD`b^K;KGLyyg(?U+Fvq*=a4#{5bbEMG#9hMO2GfD0aHsc| zT9pWi(RX50U~*FvnkDU?)Y=PceuYYwe(4)U7X z6H{$y*>%bv!fsJu8w41o=10ox0WcIgTtA(m@ABhLlX-<+X0V)5i@9ys0;vkPPces0 z&MF#g{WwGb%4b_;;Z`ZSq7rVMn-ru5o15#AmTQh$bi;mJpZ=T~zioVjKS}jC$2W|m z*C5%pw~xYfVE9j`40eH8NLW}<3a737KLACD4UOh%3)qv7l{F~T`cT~ zDBSF*InS=s*E2;9y53+ZfiESt6$csC(41|n^`iryUKCe4c3@VrXig*8r9DrxH`Wy%w(YcZ;;8$i79U&OGE2&>dEGx zwC?NHuaW&nX7CCb6glNh2jX3uqI4f`M<1uQ55+f?D2T86x(7$w4b3@JLl$@S_Uwwv z4P7_$_F@Lr5P^sJbVZ6?u!M&0LkkrV6fUxi{M!Q8MvZl$()HyPgBubI?h_^*81<{6+}#%>O_2y5mAONOW*uC z71bz-yA)eEchK6E_k?nV{c^MYTyEUYqI_=PZ928Z`)=pe&|ixPJB8%zLgtsHNCQzn z@*VG3?~!O7?gZSqFp|_%Cpxy2U9crazyV$&E#FOOfwwpdSpi{t%w#Po&t6>RGo6TY z$@rr7h9QFXm=yi=v4N2eBEK9`ZQz@VLJtuLW>@kX>*E}hflLZPMm;mn^VnhV3q@a8 z&UZ1NNe^6EW9Y>OXiAS${qD1~qMJ|p%Ah*nOm@B)dW9kK5bB!x*9%KjqB-qmjj*h% zAMH%;VObY|no|j@LH&eP^1@+OU35S>eZmoiOCidmlS5$9_iyV)Vw^?Fz_R2h#&bn5adwN5Yr$%%E-cUES-_DgA;v#}3L zdmDoyn==~{dMIh0po9K zhQup~KKgY{EMoS~yN?{z)V!`rddtO7$!jiZ#siy~KfVny>f?<=dEWDnSG3pbivyuv zX>SOITr8g7G-CR48d_H)5#5h8yIen0#P$cSH;)((&Q_~m%A@QLa^_G^k_cTy4qzV< zm7O`P+Xr5hP-${S_)TT~(+E~(1*FJ~o-8F}6KeF(SQ znN3%F9}OEq_37+B3kNfL$Ttui+eHm1&<}h#D7fFo(z(&!+^}Ci%58H5R>kTiqHX*r zGb&rPjKrK>&ZVUz0@vs26xtH5zDnqD#g}j;;{;6*wmJ1*a^*y>yA7UPE=e~&s4Kf? zxgs_W@?vvL?nd{6vBNo|y&t2*7C+;)eSR2oe?QJm+`%;-lzhn%=BTvdq6czlQC`pD zJRN~!nE4nQ$7aX0PNoHES}1o?uBW%Ooig~Elx)y9Sm$pR#$;(Tr9G|UuCoQZjkPSt zmNnrX%=uG~K$nJ?Eq+Bm(J)WFiJ#13=t<^qHP%9W1j|5q(IVufh0MM)4Tf5B2`NNA zgT#AkrhrGC1SB-OMUU>UY`p_cSwBlca@S?GK_;iOev9!Ww?Gi#kaf zYO@SFQNffdtD8Bmpx!@DNI&LQnRVh`atS>$qrA=MkBnSrgqd|iw~}*{jd0zKT87`Z z+YegK#LyL-uuToSY?tF``+)_u^qzwUpikU0tLZ0VFjHrjfm={8-z0Bzi`>bK1gXH; zVv8v0f_?bdUEDjvPq+pX3q>u@uARJ}_sU|1^^fNzj&1@@>RfnR`|g)*&Zu!&H;I0^ zaEf|s$;b^Vsun_nAM#84@2&Rr?f4nAvF(iBw7DgQe$<*j>1>!h^HhV`l! z4PQ!|Ov9_sMyDKQG^nb1LDI}^F&*#arQI;Hofa*nPNc5JUPev7;lBkZ>b}n&)I9u@!>YdTQCa6K@Ib4>-`xBjNf%`ih}r$v zv+p{kx>roQ@O@Pt%MdrbRP#*dWf#)+O}mmzZw?q5)9wxclm(`A4jN%*2wwf`ypwk? zX%nu4pG(5%^;zQS55uQKsD9Cyc78&|>!a#fgXZ;~n7Uzr`BjU(fN$z%`LAr6|Gl^t z2C4x3XPxaoU(m73|9|Bz^gr;y=E2`*Z-uKkvVQ;Qsf0a`fwed>{M*g8u)>Qc%o=|NZnoOTATr zy9QT$`#fk!f2>HbmT>v?Ov1&2O^o4W3xB>ZsEccrh&&I8OMHo<1=bLrzrswAhq9O?h8`R8@rB<~+Dy}9yn z{Gd*HdK~ifTjRe9`}HlAJ;TRIIg^RMU+&)`es~gnr8*^Od`lSu|CcSJhFT^1upK`| z6-&kItKqLX{#6nVBtq^^^!xw6A?$QKTL{4YCYnc{L4==v2jmTx$)lw zlPFG(?0i_1X{?*w3KRk2->gdojGbr=u$Zv1TeJ1FzmX=Mdw8EzEHL6=XSH0|te(|fr zTGe>5vcX)9U{v?VkGI`6zqh_saNou2N?g5qdiYvjij0j(?lauT2-{xc=}12**M)}$ z?OA>OixyMj-{i&L?a*>da`kUKjPpz1&N>j}>i6aB-M%xYUqian9-3voBu}S%lcC>( zCF1E}z0bbO!-Jq+_@rO@KL2pv)9bsmz5-EFq6tKPGrMq)9o6ea@F)lRa~;X7D}I6C zaRq>Oho%I`Fi;!>34#B8sR%)u!2WslUq1xBLUq5g6IL`Kkb|9kPkpZw=N{l6&o$xc~uSZ6*?`Req9P1)WsnSE55Omy_!zq6KN{*yBPgVFeYImG*_5}s!e>%3^ zw-iVrF(XQ(_CqW=Zs#YTb|&vK>rN*;!QbwOeC^Oz%yLobH znq@i%Ue-rfW^&*cpXMeS%ieLQ^i~}aO70tg@T{L$K>7-&WAoR4Re$iaf9ij-#lSxe z;FFy6r!}@ZMnw`=xZ<}x+Hn7GleD10q}YMRv8`H|)^E8I|6rlg5+84AWOsL5yrXjX zRJFN;F1Hn9kFe!PmQ{I@{FlcT5;*=tqf5i2C=5LekfB1h0J(+rj3!MlXK0`8N2E?% zG-+C+h~Jof(dGU;O|!=5vUT%^d6{b?9N%`jmbc@_2<_Gt$KK+DIM%b=Doa>Olcoz0 z6b2D4GV?D+^|$_F3rOYLk4h+V@*4N|c~105T{^_7A_kkI8T{WG<9}~g41UFIC8d3D z2xU^92cwBoN~5zuUDsCPb*S*#i(+Lf?FObzY^>bm0BFnqMekF(5x(mKXZL0cFEX!^ zh;w(^0eUn;F@3DksHygLxSjXfl8A(tqUom+_-}jqH`|rF8&J3RRAFNHYpd|MIt-(j zJox2ek&E&Xa^x`t8%ol`;cQJtX8ereSnTLe_V@2*%m_sv9q8){oc3|nWUu$xt$(!? z|12%upcuZezze{3S0{ZTctPmy<{+DaO>>1e*@?BMzoNifzW?#JKahSGAU)s*1%jy@ z_j}~*_apQ^M`4U!FUa-H~!l*w7jzr9wz-@BsZO$grK*VN)gGH0801^yBVf=oM=tb6s=V^y+% z@#SBrqwDof_tTe&Q#Tp|=#%SN+?pX66vClV-znui)jt;fhkwk2I_Ang+Z<-|9z``3 zHuQ-JTGhjyYx^njzEioev_IXO^C*CW%HsT~clFl;q`&xX1TMzM$FQ^FM&t_~k!-~8 z;lv@xMTA<>TFdzpCkh_tKV8dZg&NYvL}Og*`cK1q&QN?5>2gfyhJu(V6|jA+jm%Hs z;A*=|I9{3(g1dk;vQBYclkb>da|Y#AB*X7Dx&GFSfAPL4hqG=QVX*lZgwcQsn-6Nw z>{ey7W!YTFr~oS504h=LMl-HPqFSxj;%w37%yCdK2x=6OV(pun_F(4S+rLj+ixpF` z63IRsa$v*Co^Y{a3QRKpe!qECxGa7B)v9FG&89gBQkgu^jXwl}>!(7h6l2k|kc0Bo zt1HjmfAkVG!uU&B)gK!kt$n}lhF+xmvvvG4fm)5Ny^8qw*b4nP{nGtZ>MtFSRO)}` z2bp==iT~3LnnJ1x!$XE`qro<8!8hIN=pA{jZ=PFp9>MwOO-yg#Z_t1OfvI$f=!}(e zYIU{mhyLyBxPZiUO}`X3ZoJwkmh$%lsp)YWKH7GMrH##b7nU9oYXy>oK1%)bF_)+$ zJ3S8f^ka`Uci(BK7z~|R9J#_VtM}sy{qFaSlwyU8x2-T9L&_`@cKYc{<8(%hxxp!L*~>hDQ-S{F3F0=Jw-yJcp0Za)O!RLZA8%D& zpUl3}8M1g_QSp)?r!K4{$xbGmK(cWNpT|16aX*woH$9&h?y|#6NH8KJ_Wro47ctxM zqtVMU5BrY4z=t4s76|@ufkzw=7bXK^6Eg#bP?;}^%ap`r^8x<#i-HHOS+d6)K6Bf0 z_CH_j`k9$Jzf$XQw5FwHEPb7MQY)NT@>KGV^)$n$2_C75)t~zxNk3M7x$LU*J?O4X zc0TnQA#MGk5L*8EAzi&IvdL=TBr{>A#&jV2pRcm4&_%s(S3{c_cmPtAUuY#Ds4Xbm z;ru|YEF&#EKpGmDNSt>MbvJ5D?fmQ;ks5Ca!&|g#a8RD!uU79wUT@sU*66u5f8zAd z@>Bio*XrRNRyenE&US}gMvSCyX}E(E-dXm&`qa3+kE4s*BgjaszNd$qra|+dV-#nD zN9%jRTGXw$=t-(1&X{J`zN6mK2+z`jG&nX50?KN-5^vkIsO{!0E9KGuv-mGopa6fF z(@fZV9EwwBz}1GEq5T*@b5IA+Iey2~stdU7qA>w~$W(Sk5gQhO(7@BB?b&uJQ<-%FN9+ra>oW|)=Ixys7&cu zLppunpFbj44smNM5sxB06+x^<>%2PdTEe)<(qql!*9#e(j&ynrU7tF9@6Iz{DsWzOf*u5k9TaxdSE(WJ)8UyFP=vU;b zIiw$Tv7MCKCtl#PG!VVO<}oL@ks8;RC`~l!+44QC9H;T?YMFem<}$gfX|LhUYM2iB z^kzU}udyHb^@6H@VIVOu;a=SKulS1zECJG+fzk!Vs-ET@4zEi5r+T*S^3JXjW zj=>NQhC@85$#CS|8hzVFNlxdghaSiZte|WMkJ{&|%VM*s{uaKS4AW)oJ=V#6Fg9Fg zv6|60U`d6OWxmBP6T~g-tF%9|d#~R&JALYk&R+i3X zQ>l->h!|u#=cwjVXX)au)EaI~Sgj=iTAI5l)?R5nAx7l&0C(0&@z!F*fN(e0En z&zz}5SBKL);YW!LYkB5n^$T5+zf*@z2y(13;e4owx*I~RRJlZRpQ}1B@h)}T4`s(U zZ>O&7MNeu7{4nUXcw(*nwXbJ$!_Q`{t~gZs2b8i?j3->Vc(IZLvyq?&L05U+FY!vf zo!@n|UX8Us%<2m9cxvi+l2>e6VT3vjek=gQqGG6d`Xr&gPv2OGL74 z5)RS0{bBPJ3@?gJsTw-3#g4I=U)PR!M@z#{LxbBuMiaRyPIjYIoYxOS_2q3VQ{cXP z=TAgboR!&YC&$#wj^q&^C``B)^8QX|(&=%+gd3MCs;SJ@0_wg{;aH+M>CrhJ-5=Eb zUR!B0hbk9utn$xeYn|>t{@T|Y$7W+|R+B?+f}Bj8S%3dxW%I zS%Kgr`j)!7I%<1-V=lYbXvtRd#?bT65^hm7VF1Dn?mvlx7rnP4C2SadTu-%+Q z_2c`?02#igX-2F%`L&~dpwVH&sN1Rn13KaY;BTDQn?ZUJ^G!Y>fJm9wJxr>g$)v`Hm^+z14^)Iw#7;((`+}hmC`%jQ=uC zfYElC)@oKAUq|XIa-{QP)b=Z`!Nn+U%pw~Xu-DoyB?>{Z1$rr>f}O=Qx<%Pt5NgEs zeB>Z$Hw_D~LU5@!e{Hz)O?B)2i*xu<7~Iyd#WZJ3_IDPBIF2z z8)oaa8&}N%Uz(#AD)S7(<2Ev0`Th=8{PaLHzYhFr)cgPgW;@9{Y~*#Hu!b-f$KQ;n|!fKcF0K{3k*Qu%hc&HQ8T1&vYS2`7bLk1Cz2WvzQ^64Vkq(7DtZ#i zHqzepaY(1|#)~}tzF4oG;!eJ%;Nx%nB|6y{k&>6^AY@Y?P6@>GE^P|DV2)7jcwwYL z$HBVi$`R^yGoY^GIN2eiDO^Y8OL!O?Va=UJc=3(W#ZB>KtUHD`r;bzhJE+qBN zp?v4loy+1e6R$+++iWmzI=p#ma(X<*lauPOV{Yo1;od`p6nTH@6V<)2k#SYaowqu$ zj?jJYb6vyKV4d$Xcl;#3#m~9*?)j#`c#WI+fwCnXD+3Q@^7~;(=@JhztbaN8yj&yz zy&aJ)FY!ojT|r;}N~hsa3q3|*asZ>8$ULdSZQFdfzfCiEEjavo8d>axgNJ9#&la6S zN~wnxo`EYJKyl6xBvb7yM-qo!K{U@K(;3Xjx)i=I9C{KD)L&uS00`b9@eO8=!hX&`icD-VWqdn^dSe+f)Xb(UsRNj*tg$uKEo zScBm~A)v1xvis@N%g3=jb>3cnk8X^Ujf#s1)6-%m4tj;<7CjF3m1^%lzK?RhQXtgUzIin&g%~KPqF9`zL1rEG_u>&itH$xb3-(j89fVR}F@`nSru30N` z%dAaQLQe7@r!A4YN`=MNCB>sX^4(9L$GCoAnAFqvV5^F}OO26{rQJ<#bG&rP*QS|h z(t#wj+0>7jH;r0&WI{l6D})@!x78iJ$fvT!E)1~!a_Rr#u=sJhG{DHLt7)f0twnoNokvFF>`um;H{k|I# zHARz;eXDANS>ltelEy1n+g?#1bS%JWvmFL6ROZT&iT{GId`sc@!5e7?m}fRRbTeeWXZ37Utxi}3BbYbVmp z*yaEajMGLh%vU)k#ZaNEG`*TU&v@!oY^!us{qpWL3!?`n3@esgD_jy4&30<~#aY_- zw?k^%%F?t93VHQJ_NFK$r4qQXypc1BKM`uwgQt#`oya@qi!NgkQ}Acge<@c_)SU05 zhM=CncE9MxKIZ2wCzEtc$gsTQ_;P~8%VsdAE(d(NHak|L)xa!Oc*__ zHDN1Ukb!(I4#O}rW6aGpi&rZq+ty11iJ|2Zb22;8RW71O^-BK}8w?b+_`x&#;4t;Gp2vIhN0j)_jd+SLATo7CNS1aNx&W5g zL3bg@q2^3_9AmH6WhEKG7zWjw=$yL}`K~!OW)!#;;Ry%TqGuQwpu~uYXXT~i#9VgF z)83nCay%&WXkOesBwp$)Te>lGc-2Sm-OB9VAhlGSYj*f`rr7!Zso-YA${SVzM1EWO z^gTj}@CmA|>PGS)g9|w*rj&gnP7|f)ohVL<@TXs3SjVq4XEC1KpVB;7l{YDo<-~zv z1%BNOwHJY|@fkF@hRU!>>jeWgDq23Y*+p$LykRgP(p0~w(70>c8N<=K$95ByO%7;JQw=%&aNYnR1ne(U5GDEU!AXZ9 za4oseV>BoXKmUQirL6)I>qCz`4y$TlyN?;s(;|lQPXjO7bh6!r<#=Vl*_Vv!l$8h4jYMSc)ad@Yt z`MUJ#ind+(^>wM+wfq^_{@afwcD(cC#rR)*k0U*WqH3@1y$NT!b%Hu|FyJWY*NUOo zXxHB-0zs)jcCC4VW5N4~sZmcAsrQ{?Lk$ka%V8V<+lE51>_R?`-BimxCV*GE*z6p` zDTMFgPS7hDGIh;U5DJe!HPit}tOOb^xQHE_m^vJqf>WdFehTRafCmAX+AjyfVN2P7h)+G?8H+tH7`7y}Z^ zM)Y(HDm3~89|)uM3}56Gu}Z)ccEj}vePP^yKKF8{6tHNAKL$Y!E*8vjWy7cAFgc0b zSMw5XQlKS+NQOu|SEHYkNuZap8fVhN{*+~&dFCjK`d#!wDoY3*E~ZpxeFf`XsAmFO zItXGikqn#ajEm!Pp};719PtVRBUJ=r#UT0aP4Cg$_K?JXZ~-*Wp7|Y>Uy}o&R?)u# zmRT^h-a`C~Z!QD=!q6*DI(ruq5o@MgL!1fXGc!6Rqy`^9Dlgpmd(o%;H5NZeK~OIs z*j4#>7Q~v2xpP@Q8FJu9;eG#%I}j|#q~LxAGI?3f^_p!!9lrFeNuIq?{oC49Z``4g zpv_qav_Me_{-^O^1Kj=wXvsRqMnh>V+KyDXhPt51rxsw4kM^*=?lt|oRjR96_~8#; z`I5N1l*p9Uo0Xv|&x#ODD{QRUV^=UjjFQQ}kv zH7>ndw1XTM8$4vj)+bt8tTr9PM6nfTIF$GmQM6SxtIPkus?F0zIrh?mWXX1nuQbA$kDKy4hgy}g5RDI?sa0IDb^YE=;ZOu(n;&+iV*`zv z^c#528?MFx@mvUQUbKKX%RWbAL*Yfi8h#ESy6u4V(+yW6k&?}1mP+M>POwso{?T^a zmABt!ox=^}7U{DZ1f%P#}!D-jOIF3J|=8X?3y#7h-GvCl;JT<^3Q0yAU}#A}=@j35_XSb(^0=uYK1^g2gf*Dt%w1kw9XiyI zqWiI;VWuK?SzS2LOC?UKc6KFgErJ#>uO+64%U*gGR!#Bpwd1yJTNUfy2%E{wDeU{c zddx$F<|475Fa>#ty$>1twA?1IB4^mi& zttv}uq7gwVSl%SVQ{Tx@_R_c+XyoVDa$po6vwH1gzUsB5O6qhxTU76xctM0|Lm!?f z|JYS=6l@?vus*!+4oGr?w1*|lyYoD5-?oNoVtR;mvR98MiWZJaD@~r!id%v0fmr2^ zFTzE2!DfbLJg(@yW_jV4rqOX7)24QN3^5;($lXi7{Zee#Ha7#VPx66gx0t`0O3E4v@gDx85mX=O!#POM_sIQGW2tJhO+0nafPg4_4NlhKC0zy?9|qf?aIvH1o(h1R+VshxLUcH~YEVJX(?TLwD8Q>q+;wAWa0}bFlwYpb z`l6}j3=q#P`|cv5h*$9*dfI3vn=-kw1&Wlm#w1-2p}}F-khEg_!r_v@gsE{ZBBiJ{ zEj2OT1F_aD-^AqVZ=zQ`=|Ogq9tl1{=cLpvPZ*8P=;?7>^Q_E_7eR=&k#+l*dT*Kw?=fe?(*g20^m9S9qR3R^=v| zbwg^%Nlg#U)8G+Ax}V>rqL=wBFtISBg9bO1D|T*C18&^9ayz8pA{3d+|JM;-b@rA+ z!BCy_4V$#)=dtVTzNVVdN#oOdPzbz2fd3#@Ts^6JMnnwkgrG8@yC3IlMwQsZ@2iLO zudK)t9+p_3iwWH&`QFh?pR!>9A+0g%ecz3-zlL-}XmPh?zyEFkyg7&AO*OS=->Eu4 zOZNwQ#X@j$WH!Nczy{K>+T_LycuJGVjmu?u8-NC64F+`Stv(2lmMf9M6g<9)X5f!T zX8aE7!X+OQDi&X}0NM$cVQHinYs1F8QanrFlS5duC3JuKAKjB_(#F7kakWK#Ztx=VmZ%jE6Uekkd{Rvnal4S^vJ8f$+{xadWAyu8-b5$S(iojptj6AP2#XN;bq=KgyyUhmiAd`vTdWOuj$p z(}Dtnx9>ssL2)04j>MltuJy62<>_u*5%%p z=i2EVfWJ}@kl02q8JK7jH#{VQV#d^~?|4S&cde)DJqq~N++2JO|49G_FkhX3qLu@h zHL373;$v0~{wi^2F}c=~6cl(eQ_|{%j(Vh?<4+4R%n+g{k{&JLgbQ`(el6XO5H03z z*@%P#HpAS5-Sr1xJI=Nzo!AW~h{Z7YeD7PiQ%9v)biaMn&%nfTxdO^kp{ANoKp?S} zLIw`E*LWJ3_#NF5H8tQXZHZ5)GtpvXvOas=l`J$ODeR(kC=BOhCD=am*7QH>1eMR4t3SZq^ z>6qG3mGMaz%__-t2a24k>ANxe`g;tE7_e>Nrb{PNf>jHhe$=-#=h`@@*fy=M)J_3{ zLNB4%8nZJK15v|SWJsyWF2=khyu(JG)0GJe23(!}&SX-nC|a)vj-yGeyF-Z=cdIH> z5S_5HKds(ve;prjQrw*aG2b0Z*KY?@)~x$e3wJ2+<|@Va8bZW$7VbTMz3j{Auf@a! z_+NO)s-%9G0auC0ULDriyBHf_^l&=Ij-2x%pkI3m$2EEX7t`Edn@NX8n%~)mJVS>(wB9`?)>5s_V5N`1o*^mXdK6th~WB12vq%Vh>X z5-u8_w@+Qnpl4lK_$h{<3gF-X6V8l_1oCQf=`B7s8bDh%t2bMV=TxxrRqm&T5rIY` zR72yg!uII(Rqm_&wY7c^tD0FC04Q=iHrMj*;f#*n7YFphqO?yHRg{v|uemM(E4Zhs zZ5~*KL?c=0$m<9_f>)z_r&jhi2BH)-p~&ep5a$a>?A^Ydt^kU5DvY0H!yMINff6U zAEME^`s}2jygqzs;$w<7I_DMB;V#(}*<-TZ15Vu45gCtb`~gPTXRH&xsnl_Iu^Ia_ zo%5zHY=OkYn|3b6&HmZy=XNc|Wl#-;zsI~0pEgLWp z2z>-fZPvkdweb2p_w55vp>ul5c$=K6qO|W()wf!U1QO4r#nXJOSSLC-3fs=l&fKC3Lml>b7ZvxcTtVPYmp1>N)mYNKl_EEQt@z^Y>4dN>z9 zs5~eijeE41yt@URsu3<~fB9z;C{$Hg!APS&K)9bYaz4^Wi^YX*_mZnh%;oh$?b~K zv^d>g?m8V)Da|&EAD5umd`<4>{byGWEUL?QCIuX{uDcj&`!bRwxB;gfkw;H&-&xe` zce|b!n5d$W0)j(AUDjiwyBA`Rd<+?2_a) zf*8*tNFNs{=dk825X}6xuITi#QwZg6t_CfxevjM2LUMICtU%ZPQyk^+SEK+$KyZGBpK?zA%oYldQz=?2{eMAm!iP0DA{ms`hX?dSOkJj)z#(~ zg0!WzOAdHf&OBe2jguG)AaYV;@?P_mkf|n&)f&~o5RHnRJ1aaufhlQb%PP*lpX%$5 zS$(--9l5~r{y{84R1D#H=>r25#;QQ?Vc__U#|qU~pQ-VrX}2IFc7BtH2!V<5Jv8tm zg>yAy4nIR?7b4%qap>NkHEPO)JD!vS6iqH_^l>ACD>52yDbdA@(wDz92jc0vSZ{6V zohNvKU00-pw(jX8x#pu9Kt>*hVLzA|N6x$MSHAU$mRGX6qPuZWWV!R;KH70r){1&N z^LYA3=7(QA>u>t{KB}ShYwgF331!7K3N;)jHQ z=XHxEP5O&oXfH=K6|!Ax^VLpTTKD_hnAWh4N*Rw8z75AUW>@#pn`xY<*SMq&uWEOT z_&26!irb^jOujy0|FyA8zy7_pi`lLm0=HUaQP5Z)aPnE`xznKj;0{j2^7yRXU-h&& ze2AO#=7o7a!sz4^e^~v_TA&s$`C`gYtw(DzoIjqI?AZxC#;zaj-PHCsxD7CZT4 zkrk{xQcK33b=u*beR?vfaXL(05PXjwdLap_Bi|%uWBJZza>qf`-nv&lPIpLxFMyccidPYg>=vr>VbeWddgTT?BbqgGt}1Ap z6X|x{HXyMC%9~(1>uw14YZX;rqrCVgCVP&*f`bC54DzVaYOHqDrP^mOLfb`US0e+1 zjKps5V8j`MzAv;ur#fDEf<+EWN#lOZy!Z5;?`nI~`|KG}AxSq)Z3@hYPyi8bu4d^% zwaC=9`~~ZoNr7Y0P;=JGx2vfwS7W#9fwz;5%I-6h;?3P_&5g+Q-OA+nT4L4-4Z$iw z*tBzCw`AMq0+?I5Nj=zms@wcLjq7T|Rm^j?0BLMM-2u)sld{S~&Ybu>-VMrahZb15 z(RfTo0c>|ND;$530%YWhwb4z>FA<0MD_xz2+Dhgo0bVWnau>*U+b4{0oPRZq&p5)c z#atQ4hi6(-`JorP0IlXF?6;P#EJ#S3 ze6im^MhoY^nkf>ZEvHs}35<}TWTs$?rAF|ylCf)zwwd%T!nplo-(pJ?s&(~IAG>~lQS~SA7^R^>bH>4~Mr1HDpsvwHOEcC-% zInO4wu&@iiLUZaGw>5;LHj+{%+ut5b(zH#hFi&kQ#-LF{_a+E@RdtP zo?DL0WPnt%VaV2J_0TyVWfC~(4{@v0+pP>G-m^EhRUZ2124Q|}j7=2QcShg9i_R>X z2Y67r5UX#Yx0?+w$7)Gjl9`nk@MmijsN>XQmCy@(hpWV_$Cu zN~E5(4(~NzDv~;}apySLn`mI$bxm*3O?Ihv5H(M_?t;oLpV4iO^&8P%#)~A%5V$K2 z{WcT3NOv5%rR`v6h~b0RIb+(N-tzi1uu*q_AT%r`9*TVRMGzEA2?fY%PS(n7s|!;b zzPY{UvcHMUE9iBz~B{bYSMQH@{**Xc!G=tn>S}s6?nGd{!08K3$0SS_2;WuD=eL(N^43@bU!SHM~uu4Hb$mz z4W{|NXMVm)w_Ae~4+`fVw=qPid2kBJ@}}R^ZN@|hO=}#w_dk&vO-2*fnqwEj^yAj9 zhsR#G3~6_hj?g@K>Y6eyt?AP+WrKN`Jw^GAbc1G8%UZaS1KFnuLo9td}RUTka^Svuj9?zrJ++UiB6o5*nOY-kq$P%onQL7JeprcRevV148I&_~7%a;Gr7-Oq+ z6VxxJ6aBike1R9(xJpW)d{$2W(|;!YujTy^oA1%hedZH2*cY zWqudq7mROcwfhy{hhxPnPLajUh?}|AntK=Qx3TOw)|_>B(pBNjb8!8+&8uN*5iRlRg%`E&%**2cYOh7&s(W4V{8 zi3uQCUejbwWF9pGc#iIQrk8ztYeUB(`6%xPOOf4{?Dke>ZeAvd&KD>sQC|w`<(zp8IHQIzL2l)!W<~X_;x0-1YRf zSHHHhtT0y%Y`X$QoX;24(uPcVr*7PD|3PI5FuzqCW|q^JN7 z=bLM|lh#vECPj9Y*o<&NT$!<8EcIWpUDaZP6`kQ$uYb7hb8IeOa<$ecbQ8#% z-D=EhYfv@znkD!4OkmSfm|*`^Jih0b9;3wVy&WpI>dx~s=hq&I`|@bux_0M^T8LG0 zjZcBe$5oRi*OkKJP#vQy?~PN7?c+KrG>W~K)3^v}4-Dd+Hl5UzyzaQQI<0W)99duc zVIf%KGa+}wvED}pMfH4eUS{+?i$?s0oliSwbw}d!mFA|fLj}^+%jqUf$Jn~-LMBa~ z&Ch1vnc8G(N?a*5^zQCI5IPQ;=ZMrYClDlus8IWUgbAb2%Zx#vz*HWi4&W7&Gw=Dj_Q|Ge5%X$ts;Bdk5l`t8$Qp~&!hDBL+1$D?O`qq zy>cnqA<;|!;Az@8>Rvpl3RBy4^TS?R;}-^QUdw&8DP=~SF|r8J6a7L&+(8$lS@Dpv z{+fro37KaynSh`UaZ-C*^)N0p=pGd|H1%0PUF`~sw{6*O@)zd0t)Y!iFnnly2}ej1 zhmZ1F20dJ?Uyadht@vIQV+|!PzSsmlG#k6yJ8slW z(7p(T2T})&bAxcI%fsVj+;bi8sdjrh2ApiIZRxNpvB3_}bH(Z$eDLx@SxG0O-A1+t zZ1+2eA*=O`#1_odGU76K5Te#|Y|YvYZ4Krpn2|KQCE^AiaNYFk?dz_t2K+VMMvc}V zK&8Gx;Lr+LXvfR+LeG7wJL>k=JM|M)9ShvBM5@uti+MNV1+D-#t8g-SY%;O2Z{D~t z>49PKnp?bnEU(^?Z%bk#28uNZHX6$P27^xxf#k~SIPnD27Ua14`}Ka1EmlEzb#Q;A z+0JcU(u98hz)#BRgy5U-7BS_wMd$6XFE(R+FD~0p;DlgG%nZAq8RrFZT#Lze74(f) z=C$sqNP=9c#KY3ck2I>2c0U%#p-2_8(Sb3Lt~GOV6opA3KZ5WHirm~ky8?8rtxPGs zgu&U#l4~OMxz}AOFsg|-Wvm+0p(9&mtg7;N!A`x{z{Aw#B$9xR_n zs9jVIVyi2cg$z5%D8Gi`d?2(Gn8p0bHlHF*iwnsaLL=`q2iG|t-QZHA+$6_)*3#Si z6WH4kDTeOd-+RH#X2f4W*BL!L{Fm(Gn5nnNO=USZmILZ^wA+b<)R7?U*V zO5fSpQl><+jwpYF?Ka+^`7?bY_VFteKYfF3Y@#4Ptfn$ajyAU0gH@>^hE@%x9%z(I z{!%Rp9Pg0gKp*uyA>FAqf`$`3&O85{^qg>E1c^Wmq}?tRB}5886t#IYceKI628j(` z3#=>KU)xzDR~jo$VB_T4askAh~>~_&Lz}I*&;BF?(qlz+tKE`h#*ijf}=0qXj$bG!|YYDPj9;J8z3g;$6 zaLb?W_X}!#I_V5U6L2vv%_UfNY*y*?Jm}rzeK)A zO^tg)Pq~Granq10Qv5T_k$!;;=WlE)YIrv!@4@oE+12dCsCO{z(h=BuJ>u&FNwI#~ zUA^XYNN=@0j}Mz}eU{%-EZxgqwyP%!)LKH33`1=KFBauoTy7PwdbzH;f&(FKIWHft z^(xHz^VSwneE+LDN&d#?8=B6~=2)Fnv=+%vsBuE_X3I@Y`2$OAjaYfrvE~fUf~kyq zmA%~EO1Ym|eB6UBPMIyyyzbMk3YqIPr(Rh)uvEGgvj*y-uj!N7I{EWvq@ z1);{-EUWE$Gr-HuvFj~4-rc8TdZ{AD<3@jAV$@?$iMMKE%LwP{QBfmyOKAo9qT87? zzlpzb(C9$v`h~x?*gKrol>zhuKU;;**l4KX*hjOI=^SuOCmn`8Hz8C7;#1o%m$kRu z?$Y6eJtFu4wkj@0YOUq>TYT{k5u^-gGE{OGeEXck`kKc4XfgZc$Kqnb6|0y~6*GAq4RNy1o&$oP33+ouZ-Jp&3yV&?jRMZwOGEb4Z{pKtXZEbH?maO5nrkQEp za<7>gEznpsNjwm+w>?Gl;e!FLPO;Adj3^)Gf{v{@oD~Qy`%vx4I%4O>t0s+3O`PI- zo~~jTF$F_1^;J5kbYeGZt{_BVGV=mop}UMTGaM+iz?ZDmK1*N!>%PJ7lq?P2z_1=O zoxW**A-Grf=_qj@*BQ?O+IbTDO}R`?*8%Ocrc%MHl24uriu{8MaMJtBv6Qq+6KBWF zFN#VaxS!gwq*~=caEyJzmW;i^Pa?e+;v!v*euMNbyco|Zjap5;Crwv4g@6s&(Upo< zHt*f+)&iv=FZ;xWLCjCLzGEV(?h+-wTDJLHu`Na0r#F*x%j%5vYqP%9w;?q38cfMbX314LuVL71lc=8%X{&V z1|z9Mbv=1JHkgJAbMMNt$^fH=_#fWgbhyA~1xuV*-!q+HX&uH05ZUeG2AQmht%Q|3 zhMd|01gU$s+0sF0mlZERl`W#-x`TY!;!*;@F=+UeepXTefvZ{R^izxWaaK~?G zFNz;XQq8ZplirI!P_ID0tY2=7ankM1m5iV@z%2WrzBk4_K#*2_P(w^EA?`G|?;IBs z0um>8e~&r1oWO}u{ey@N}@1IM`( zlmnE?zD{Obsb+;@Y@Mb+HFi7c1~}84z5$ zF{YKSdDYCu^+lo?aa9+00)w`&i)z)!wacorg-z| z`OLduPjSw52wpd`D*yc)Mz@)tJ%Gqy>-&2e0%$>SzyHuc`_~ON7_+Rqw(mt4dRWwq zdI1dLDv2&#N}g4S9?_MYbE8BSN@QybUz_u$8%Q_2QjpxAc%*ji<<7BoP>pz54DR~J z@W@X45Ckdex%@^^0m$X0~@B*fbbwNk?HZ9_WH-Gdc(tZM~zN?P3<=9rYOcGS{ zZrkK`j_)34LU8IkSgtp-c6C1kJYZP-(TLSPt82(t6TYUS3P#u1X2XaykfECvWl~dn zRP#JOhc0J3%Mxr4`x_V)bBoXSc(Y^tuL<=%jVX*D&iu_-LB|D*OaIc6P$N#v4SW(} zK_6Ys)HGhaYKd0wx*FwUKxN_j5Py>b(5A$vljF8N{Z;NB=gmr<@#UhZlgn4W+s6u0 z1s%uoFq^W&;P+>f$*}fo3{~&WfN1y+*+ITs<5e=u93w8~^K5n6`V+~0ru`NQOt$m) zpnFz@`v&Lf0%fl{o{L^{-QDv-O^WdGa0nxcr1f(V4(=&nyUTQqz&_EvnLDX_{JLzc z7=pc3+yUYWOwq|BPgV?F5^>xZRgkGx*SeB>BF>wm2*G4>D$Aa zBB_8Gk#IHj03-NbSCU-F(pC|tMUIn0Y4V0$s!ex?T&z99H)YoOj@kPs9!401sN{M- z^>4Z`a`60s`(DPe)10K_uK;NlS`_O+{^4Jmv|ekenPBc^>$a%l`l1jV#~fxLy0BA8 zZAK#zb2BznVEQg|i4r;f2vB3qFm}#>VUa-Yd)rMp7RGzg^rYjgZU~_5i#+1FR`Ki| z1h-AgaLWw11;w{7upS(woHuj(tipnJ+cKuc*phXCu&>%rFxBj2&>+C7#VE+|$3l~l zPAQdBXMj-Uu;fpscKW<4vYygQ)@0Qx&-#Du9=>2&vj&NiZivRFe8n;IjY7CFBlW1x zSnOvC!Pa zzCVAR_f|O*%_R!*iF+ z#`y_nMY`GYcrF#5j^bQwDQ$dlxhGf6eXCo-N$`hX_DCLHA#0Bg+ZL_CS*D?^_uZGM zkj@`3Fbr?CB#9tQ&qLv@3DMroCc_~g5}FrDYP&gwvs{??I4-UB>|P;iTFiXVs|kef z(l7SRVF^zljLlCQ9EMoD>ja!q=0o#fhZ9M$QIaWK4d+-e{)K{{-HXII9j~IRjFUT> zqdRA(Bs0GrORD538D@lU)Du(6{fp0*Z!uV*S?y9U!vHocmwtU0joEd+RD`zvBFL## zpS9Z|HnK)iLa_UWAfbifI*4p&?-RheGsB*Kzj?a~SAx(-Y(w^?Z-K=8#c_{<_bt75 zdYWGj>%W7+edA3X!(yPwBw1N7F9v51{uo{rIOnt+aKPt2<@H>>OcAZecq>WnDyK3x z()m%tKAD}|7k-}i%y2^}Zlz#cn*rmbhijvw0GsSN_fdJg+x)^8Hps=UY1bPBOPE9O zuX~{m#~_dJG7AtrLT>eRh`-U57Q@EE_49JUe!^R|Tj$Pi*Aza5!L3}f)!v2=ai5GI zXoT_rc+W{MM6FaOky64S+$NT2M=D0 zM5c*9*H7!TvvRz6rstsLt2-37@Tm0g z(;aEQ5ekVTW4LZlCi;r(s(k{uDTVAbu0t9!Lxecty4gxA^5jpImQuexyB~fe!2D4+ z`xz<6QsH$sS{8Ph725!>AEItzG3yomqPd_PjOjg?6e88&eO8!#c&&k!tc zmepFnkux`anHBAgRh}79yA`aba;vr17&Yu>AoPW$ZkmhZeRTO?_(f@)Z=O;WIa2A~ zgumZW4k=`7Iy0b$Sp8poYfx2_ z9Q{DHkU4EcLfGM~<9m@PO0c9&$M1e$pAmRBj8Kpwy%Jd4%fBc7_KYOb>uShAd_y8< zQ&VMV*pMv*-~X%mH!y8{hdtMAkfL>`Vnd3sB|;MYUgkg=hARY(P$mv+87^XXX)sX# zM!1EQ*Nu`0^Wo<@??*wNXFKbPiH3PRK4z{V(!`lSc-glA2 zsW`0;6`drBTKDf*(JqUP#=gM2F`@c9p&KBQTZ$-gQQ5)zF9Qig+u+z8f+&_m3``;Semn4U z;M7eXXTS3%0q+0kC1Al##~vjaPuQBGW&bIUri%a9VV;GmaifZ+7v)3O41MC2tao)> z%S69XB5S@=oP}lz&M71zVh8eoEtTTH==?)K1W^a0ttZ2Q%I$t59BC+eK}RLRsjxMBNt>gsoeBD1X$r3y_R zxBt`y@n9{qm5QI8>gn+M3>5`tp6i~g|HH*f9%U$Im$cyz!^4>-hy9^8m&JG<1fw?< zS&Qp|CKTPxtfv=|^<9=&M!eV73Ce$^L!L-r(u1zkgYl-uD=XyU7)^Gxadz9S*#H0e zt$AaQCNmZT%xcY*D6tRMuJ=oz8q>#WB`ejYT`Q_SKc8Bzjx<+cZ0%-m)+~!qO6~Rr zBWjGA_LW0`_|WO&>^~n`;x|926#y=2NUzrpE`S8Kx!o;xH(?u=8~p6^uU*hB=%(xY zDmV>vxfxwP*SdgP$;Y6pGN5BIUJ8j1rMD{RWS+uTi|tHBurcJmN1S;;l_ek*vUnmCoD6JqQH4 z#f&lPSjEMN=lA*hXjkIodI1#4DgQaERj*8b_3nS2g3)Ah?0O~K(U@22bWaEf0*hM7 z<@+?Kb?J{l2ddV8-`Hmg=5qj3Fn_whm$?}|5FX0&%9b?+z96~%jpb%MTo>Zp7|=t3 z4oqK1M3{#q8KN2oj-8tVn3HPmx9GJ!1QASK{PbF9i5x75Qi@p7n)>JU6NBxHjSy5| z4{McEH%MUhZ}6u@DDAy3N4W=;Fkt-F{(?AmpoVK34Z53~ekqz7bL;Mc($8$Ki(IYi6(g+<1x3k3p2y$O` zt%B$a{SQPzua9EWN!!brkF~5u7^Y97Aq`LU3Fkm~Oc5A0rfndbNWHm{Fw*`$YOZ_W z@l1w8B>7iL4UtmN={N~8tZ;XaWV4bKF*Cagos&z6|4fB>K7X^Fmlg~gWH+uOmSh0r z=97v;@OO9xvg&V}pwEUto-988Gb(k7MGSR*_Rea1hFm%E^WZdz@1E9ZO-eC69IZ5; z;RDyLY{%m+{11xK;C!iMi;8X-6yhbHfTAu94d&@}rits?+yPdkSbZ$D*9Q`GxA;7GpL_mu zV#{Rl@bV1SegPFFjFp$TWmCc1^IN(+TV>el%P??>)>q(4=nI%9!S=i~-2u7h&rnus zM10@R?WZy&cc0$^58Lo$ak$&m3ups&_A@y~Oxr@@eK&!KEeE`St$Aj!KMIi{HmLFi zE=-Lb0t z!kq7z-nGk#ya_Sj{t~$8l3k_l8r*gHdiu1=G;lY=*dQH;vI>g;@Z#Sl-i3!QC1~hy zFp)SJQ~1|@2A`Qj(t-WJGtyj*U`pB$a`ufJIU#Li<_Ojb%$T*w##RVs*sj=)9@9gCnXI!AS_l1s`G{MG=^9bP*S zvDcb6wE~y>^Q6V1S5i%+c1-A;p@{DWIiA zJJ+0m-b7;bx=`RLh}&gol3>FtD`mu;ecb$bkF3KLi;~&q+dg2jH8irpa6RjCVYaWP zjxc<|2WcRx>@v@5JGgK=$ougRG+lfcmzhx=Z>)=X6LycFxTf2S-m#y{4w^3cdbm9- zvN+o^zoRN0p(M5omvAE4*b%WgvuZufw6I*E26%|Fon0RO80`EI3bZ%-O$>25WzLXi;qHT&(Ev@?1%fo17qN7?@Z*=UGw%ny>lGgI7`{V#)~5n1xYdAF1Uy8FTA)w!DyLB8EgI<-}v5yW=i;6iev z82$9fVY`sz?@z!mt^3?4$tYxrvBv|3-H4&VaIwNqe}Ak^jxcv`og+@?c7?8!Df34B zhSe?ob#2<&KLaU461aqgH57B4(&7Fh=?dBnix}9z&%ek?XEvXI*R%q-5&&^w4C2V? z>}kMK+Dsag)lEc+Plx_%6=?m zFh#b+yYWiDb7LEbFe$2A{ttC`l(YqxNY|2?${RXpzQq-S*I(D&Cc%OlV0g?1B z(i{o!OQ85hUlyM{>Z0vuI2xu8#b!oSO>7W4z2DiK+=OyhT_K{l-A_rVTm?uET>>MT9V zuwpKwoL=aeFU_EGsQXU1XD+8>`DGT`z(O^9-F5ri*fu}xj^|K^=Vlx~sspz|GE#?l zdfEo`F0$L)=?s)pf3&_3ZHkyy;B==6o?KX16CgE zs01oKkG2?oHmQyCX!Z|MQw}4(@Du06!rSZrUX1`raey6Y%G^<(gok413#&m)O$3TT zkU$zJ({(4EOwo4WbNxE}1ZWppT9M5BM%fBCP4f))#LUGoE$mM`;v#VuC_gUo(r1At9LFy+17Nr2CqkX4;AA)9~ zL&LHqo}Ugq^^Y(o41VVX>;uACfQ_^2Y$|7S(GO!((M4Ee-NdVgPtoaru-VVRV#^KY z(WjL$ox%}Wl>*^s{{(_jypDAd88}-WM11@f2*fwV$rwMM^Zu17fhhY?7yyA?a7DkJ zPSpArz^Z+xa`$)4E?_X2DGoiL#iS~T>5F3yHo(Vx{@e3KQ(gaI7!z8( z|5^PFMbM9uK{(a67H_!VSSHSL{=jt!HwAXbLt~h|t;7(G!bXyw!VG2L{pqb&ZaJEf`&KY!8Lg`uXg|PU1JzfXCZqS2!@&t)3PtB1h2?-;(fIA_6EEnX%4W=sG%6>Ks`HZT<2~3CZK1ww zt+z8xaakt6Vl8+OBSn!$rrXvj>CSe})lh6hgZ6*|Wj8Qi-b4n0EL@LrnI5QbWp#+E ze|yf=$^(UM9;D$yq+fDS{KB#&wrKrk*%Ua>S`5>%3hpFN4qqlk{uFI?Y~neRYJFCq+CYtSf)SNQ4Mw7+2wbg0Vu%;Z!;8u!6`5HrSh8jXK^)&-F>cKx% z!P5Pus8fpsa~eDx5EdLMVf4?-nd7v!e4_5EdbSL_VlE`~XU12>MR?AN7(W#X$P#69 zduGuOs4>5#n+pN@M*xEG)^EF2J_fGI+W2~K?`GPI19RJX*#g~1QW3NSSXNQi>>Oym zOXb(!lHkifuzmXe#u;T}v`&TY_BPaQ{2F0Sp2<4pOoC)wUBV7P{=G&$P%K16nQ0Y~lco5#Nl9xTwJCDpLPLpto+7zhCwDS~o zSwMtn!A9r3B$YzTH@{Z5D0j6`{Wp~h&=c(PriarZXx zuWcnVU|^2(BRmA%hXnat#e=uN_32z8O3##IJ#7GxLtxWzxcyN3DGesdX+$j2d}0IO zZN45T-GCunCjIPh-uFXIs;Yy>=K06Z&Ll41^?F#*Hv0|%$5LNZXx{_Ja^nr>juPf# z41%XMNH-RO>#jA%QQ2SjA9mRcmEpesf`rYkeRxDw!_x`tTTgaF7YXgP!%YZpUa1$mpH2*cE|M znAfI{4%2ljd##T}(@j;dqOf1(BCY)hkas>rWLXpj(%uj#d%txy*PHkSYYKtso(rOK z-&(?TAH*2pg4O6y9TzL#P;1d2z;tav2(jUrGbQ!a+z^THeou-YKLle(YuCZ?$*>#? zP{%IuB4Wp;Kmj5B03NzkprW2IdUg*VxBx+7ahD6-Tp#pZ&KwXqp+ZC}n|5JK-1H%5U%Gn$idEwqD1zT|1AeQkmZ#fQw`a#ezA5KJZ@x8G6&- zvaA~37pP#wEU#?+7}D@ZBXm9F8C*j1c6nr0hs!%bT=eJHIoqHFTy?!jefB}$8~P7+ zd8?(jD^D>esbIBj1z)+jN84xgV4jr2Q%AdPtB&Z^qONz`=-3fahG0oRE!Iz#_nT#v z*L~0@{=RdW1Z=BeJF>Ef3(-Dt3~2sWge-Z}YEUALMd%buVnB!Exk&%tp@S|!$h=F9 z?i5#cP5rw+31twU{(~#EWBTwKp3~Sd{0^q#iqbO_l5Af4gsDah?05Pt=`>Rf-)Cz^ zLfk$piK(k7kfQhw{BQ<`R1&S8YM};sveM9a9&v7_e?32614*J>8 zHucq;SiGa&v_F0Jng-a?oO||)q2~q$Q2cR`dwWyF54^e=fHz>{dk&|Tc`sX`+&9(S z291fe;kmeHGEt&S!gQC>Ya?LMDI;d&ig~qtL`d}4UI45UUA%f=*|h=x02f0Dj5V*; z46U4V6Mh!-4%*O$KJ6(LT|3RCCq=K-nt_@VcjExz9tZulqezOP0F=K>PbH#dbNc@- zk`-?q(4Qg{99X;fwR+@-J@eC#BW(!MH~kqTa~)L_Z1b3TfEwW+z?QNWr+~WyU;)Kh z1$GBlyw?8}zJy{IIQ@NVI3sxwOLBp&$JRFo&Ra-fj3js`nJrJYVYGC{fUL7zQ}Azgop0lleg@rbTABLo&C1;+V(`U6RaNb{6x0RvQr zCe-SO;P^L#dvJ-S&AF@<3XF&+8Ve&#{!l0x{7+4}L-|P#v}( zVBY6;-rCccZAUu>R9JrE&=b#XP>$w!l|zDmDUqm8jtum^!HQbHrtMd;0jL<1Sm~`n zTV$u15!+={*pniq2fR{d1mLoA-}b15HYl$A(=$cq8&M$L-V^{Qz=}Q(c1e73^TH}}>w|6SDkA9D zo$p}QW&dSE^}ah+@nMHx(6@gNm<$JXh+e3ol~G*5M$|z_$h&b?AOc8aXCsxO-rSRI zf;mSL|2*)uR1bviyWBrxc9nb%Y`Bd95s*8Ng2Id$s3_5E!NRO4wl2tEP4j!O$iaBJaMH|OI6oT^%)@n33 z0$sl?*~WUdKWvp0IomgBCKqs8KTU@Tx&5`%?s9~ZII1J`Id7}GPa~rbjj6R^($0%M zYJ`|$RHlT2_liLNpl4qOE`<#%rk>UOv%0x?Qt-I^{320JS_zw+oWL47(yjuRr zv>T|jHQ#$^>tc4-m*G52k^6h6h@2=9KGfM|g&GF*5cTmZAo?&pY)JB-f@NSi5J!l; zHL9x8ssI{`QUA?vkLeNWY0u#~g^BGLC~Sh_Lip3qYF=ChlEAER7$71ohLZu1zE+^B zv{`agc|E*TY^dX;UN#**C>+kBi(;z~R6=z;c;y0Y^pt^$02Lx{n7fv4PX89WUOG-@ z$jLP_D3#cxCf7s;cO%7=-h6EnoLdq`kKoGY?YQ!r(y3%YrpK*Xu+kji33tB6WYv*F z0&DQjs04(!ZkJ<#V;b1{{n3~`=HUEC%gqQSomS~hGPIMu{IlhU>_OkFmZgf_N8}>AHJ-79-DUmUdRip>s^mpm-gJ7``_mK79?^IdfV>c9cHbw${6n%YydtX& z>_0~rH4r4vvzK=HMJnX`6j*L(05d)M;y6tyscXI8L;~cu!+k1S=mtF4ODf(2YII#Y zyCxJn@VGOc3+NUCqNwvt0Cil?!~W}WpB@01>T<4c-rC?N$^5O>l#?_T5W1ytOh^mX zAi>TAO7!34oQV>hh3nS*)Dy>?*QV%$QP4@GgAn}f!%di-$Nd%Y&G#qDu6bLgB)-)$ zMg{-Tus1}7=t1?`!Glxr&f4oEX1nc?`MJ%{uIc02Jm9a78<^sWs&o;ChoW4r{vopb z7io>HR-3gf=7Ci5+3`?y2iOoImAa~Po5?Xgm41?mAOjXgZ$*ks#3zf79t58M`}E-# zwV%qbkf^HjeO;EunwjR)gudKzp;AJM??W7FpTXLXjfuy@nL(Lj~)-U7xx-G5nGzz4DHU;`eIvU$lgztc5BmDfM!D%S?Ynk3% ze8vzh!mmT{!=y+mGs8vX=lFr}i^$ZH%!{Hg-;@X5H9roOa+q;E^*#7E?&X`^@w5^5 zjI@DH@M{FIuUU%;3R~MoX+zxr86yvGYfA!4dx3Gg5Bi83>ls(<<{Nmg7Tkqpi;O%3 zj71?bOY{1rUeYfY=ac=~17|EcC^oUUm-HB~dW1#ZLPGU`}Kt0j9BnW z`52lstNc}kU5IZHlgm~^slAqf$V@gTD$G@H6}U(B|A0+3{FH;9_CFL7XG*=w7nhX8 zg7q~`y}k@wsBFyP1{%4gP}ZUW-_Q}nB1RJULh$-^i*1f7_oG0} zrN0SQHZCfkkoSpvN9iR-7~)N~G=HXaYLcgfddT+-m7`{2vfz6|lb`I(vmBTsCrH_GM#OYU#~ zm%zy>N>OIRCS;Q07id=Q)<&8FkP0gXDH;pNb_ay<+hIAL`@&x;AfUDPPaX|Ll+W z+SAx~y|3Uy{zJHZ0fCc{V&CPqZ-N$%wGcckj#*+C(%`QTk`he8i%q`(9j$X*d=E&E z&XHNc_Ll&UY$tM-;YaUN-H)e9avx);tKP=Tm|3oAx%GjNc1uZ1t=Uh&44cyY=hm`y zg9Lvw&86|_?PgPSiS7xH{Tae@PAzPf79-o(@YmaOuSV7_H0M+EtJordKUAL{LtRM{ zi+W@G6N2>O?*;HrtAti0Z=hd?;_GP`N&OuX%%Z)y*&;ogjS3hY9jab%^|%|8;unX} zB)%qY!FS+*(J&jp3n)Yb=Q;x7B5Hv26I~28unD`3B77*H)G6BaIn01`( zF65H`SzfG5|L$43*IJDE8|V z*w<=*edaVITEB&l_zx|RVQES#OFG%`A7vyE@gt-WN+GEArF(?D((g19F9P4e!rbBr zJcO@?&q;v_xi+9Z;KX(r7~ZSQy4Uz`IgaD6<34V^oaa?7Zns;luNVr$ae8fYvw>+X z`Q`)l;`i#OUwX)|k@|iymK*Rtr{r;?0e_6~;r#+QkG89Xm28Lfb6i4*ox~*?1Rf@|N3SVfJs-+%GCiPLLj{{GkwlHA~fotD4tjKT5wVt@E2l zx*8FWViQ4hmO_y=M^gw&WQ*fHz1#--9lx-Jx`YA;KtmaUh%$cHnfvpdoiE=!5{R-) zPtNP>6Rg@oVD>=X=D-g~h?bd{+rx8~3YPAVK^v^vO?ePowS8)`;l*r#60uV`((m>_ z1jVZmEG-GQnktp-zC-JG!m$oNYa_!P(lAsPukYMMc3;@}!h#K$l1fRj{v9Q{R6w=b zXY0x9S)cBiHfVq_S1s%8{{B7fOqeN76d&baf;1rdU019PXUaz-l*YY2xPafr_waX% z^o)6i-G0j)6c1<~Lnj6*F0qVFx9-wmMuw%Na|oUzEs=8kAaFggcG%_#QdjD^9Z_zT zJGV+NTegLC&y9R4Kit0PWtcVH| zeqcpd?oeu3UCg2S-|l6eKtR7^pMm2045QxQqG)rwfBa{~N4L^pT>SZ7gFQCz>K$J? zYjsNsr1YZI@V`7)xUMAn<97weVve~5kU{HO;H16xdW}Q!0E+jf)joq)^nV^<@$MV_ zJCyrryX>IL^`3X^Mc}wVZXDP$pLNmM53&Eq3ocrlvkxDBYDM~=hj9;tKeHcQm$-#W z-vWm1L{Cug8ZUopclJQRbp0+BJ6e6QsB&p=z%!Z_)8=XdQt~H6wbE(>um}k`s}|Q< zk|7W4{sA~zu43nW8q87{lmwi_!N~(=Cnp|dvr*}LwSb9|@p?kTjb}u-CpuhKV95MM z(!p)hfl)Sy1~^Q^+DVQ5Oo2y-tqxpER%g`EKA=_tAd1;pBRz8QKbh6&lw` z!?k(@?cH`2hWf^)MrYOfl?igxtS0o)n*%8~^g(K`?s!Dzn8}VWgS_6`u$~&0GcZAn zTrJNY-4VwCv)9juPsM}9P=K`I!?vI~$j%KJ#i6U$K9iv9G#Y;axXo6FrrHu9rXejCEHEapQ$@%WtUj_r`*Hrnc?LU1OkCzS^1^LUY#DG`r-oN}r>yRD(Ro;{ z^qJ|N4=ESJE4W6!)gWTQgsyhq7ggjGvoW14&)O?`g#oekE&B7RTY2Q{rUElP>b$Ld zXrCy|Oxxh#jeKhD8mTmNerWTU+t(*yFLJhJ|1Q_jy0k#om`A}u-vG_5M{xp8HV=n&6i`Ji?}5ra943n}d?!6| z<8Z`yV(iX(v_xDmOC&L=qg(CKbAAi*1rqFwnB!OfQGqT4ZV2FKId`%CZCF~Ebm9sw ziOcT@ceEXh3^GlwHG^P5HK+8T>pXZF9L+H^oro{;-slG>Ed=!eUNDym#5( z7OLia2tGRx*XY}Mw*R*Rw0NG!xXDKl=RxkL*%06yc6C~tkBS%@yXQ6Bru?`S+_kN* zz))2JX-o@U!E`#{GZgw12Ns{uG8ZWJlfP3D*C4o1fwB?*Om| z7cS`P0zFh-`fg>(u~T`XB7*S)?W|ORSu^(hy1xz+Ivkg6ntP z$d!7t#-U*Bz!i)H)HtzL{Q27bQhbtC*j{b&5RVosOhhL6IAPe&f^!-)U! z%#V&b53`SbeG#vJ$o(XQZ_g$ioai~i^6E8<&?5rxHm>WQu%J0x(9MRiKPFAiFS&w5m2|R3E`4SlKEt?w} z9m@&7y%jqZBHl!Fj}%j`c$)s?`CXE+JO@+fW&|y%;ghJ+G%5 zVwLLJH}GeXo;%jwQ?s0K4fv3B-2VL3j-q?Y1;;}kBoj(42snbNwTMt?Fr`{3tPqq=nttS0oL`s@b|CtdN;-=Wcl7M$Qqp zG8Crs{jz3rP6Tm0@3HySTHPVk2eI0yZ5zeBIgDxx!ttd+8hTPvh7J7mT%hRvp&`x(%56N;#_%Wn8MAzl8hF}!- zSCP6B$IFTscev6q`uO*zb?e#vRk&`vQD_&$X+mNBRVV!XIyL6mpH3A6iv?b*<_RYB zJ>y$S>4p1T2f8HuV$ZKWLlu3xG#`X+CxPwcTaE>cvLmAIv%c(MyUA*KMgpT5NQO(4 zmi;0}=gaddq&M`Zn9HwROy~ktoDlK<$-w1sC|+qVc-KopP{&i7!yO zuD)0-`*cf+!O&HN^jjzP+StNT&~QqbD#Z6Rof2cOyZM;})_ir99lfcTo(7swk+XWq zZx?s*R^^NHa(5QoCqF;GH^N-#+I9ZLO_3K7KbvtKPVek@8v>Iwul}gAxpmAKvqFJ#&IDDjDzN!64=1dVz|3i`*Q^kob)k!pv z)7v=lu$wP=*+Pk}FZ!61z=qEMx*rTh-i&L9z!tz)70A1J+QW`u$-UisYLPYbNET5H z)C6LC4+lKwsR`FB7KG+&aZYsKea=bPb)6oc?7ANX2ceJnPFv7n5iOoOYHM4~`1e~a zy-a8+r}aw_f7cH)j_zmb3Klv(yQ)SJ?xF0{Z$FAt3;IEZF+}=lqZ(h6yk7^~CpxgnaDCUQtstm`A8{fVot@oT)jH(@%e+A;3gbA|1y%$Ct9{4Ok@V9Burv()o`}5rccbz#~x@wZ)XJhw=T#kP* z&Z^?Ot~;S9OrJ=`-1r{JiQF37Xww>t4e6CvZTug=iFgLtGcc&Rnsu0`xC{H${FEaJU0luW6)%-F- z{XIw0M+)Sn;Gi4cxDb`VLW4)IoLk7T7Y{9l&KO=@;vZ3tut#Da6SJhjObKDim*`4L-6^A8{&n* zf81UWUQuFDCJ#tp>w0$1c{p;A`q>`{4Mv;Y9ms3RFjWgS?zuh!*NrV8T~&a>Jh&>j z&@+q46~T-m1iaOs%vK2!40!@BAY7xu+2%s!nZ9^LmjB4@?54`Tz2B777&l4_`e&we zb-|LoTMN!6IbITZyapwc12M?j(G~ixB_Bv& z(-NNBxCE=Be@jU^0P#}2S225|&-F8*LN$)Zwx$pY6T^!Nqa3yL`;$GWG0Xf7Sn^>l zhK59cOUh^Cgt@Q&yiiyf-9S9YP4jzHV$cuYdC>WI?YZDmzE@C0wqQa5+na}Syom8a zBr27|#b)%4C4qHNL5`v5>%w z&iV0KID+%dR!!vPN{x;NC-=wpaI5B%WQ5`bc#x(Fw;NAfd%&d^n`n^wki_?f1iR>x zQhj#E)E?X=*P8`VhT9+w=zze2E)UU^8VgEks0E<&_rI0&dDfajVRka?P^9VE1~qMd zW)c;GPti?HjxMi2$K+;oq>sZBW^@h1x^j^9xjzXwM$ls{5`y>5nQ0K_B5+fYp>J1A zvmk`Vk%96D0jDENqot9=lfh6@!q3o9ooMVBphpT_MvWuG1xcS>vDU`nqDcE)J9Svm zfmgL-Pv@Ypf?&wav7VI5Ij5J=hY_6p&)U(&=6eZByoi*&Yc!b7ikSi9f8lQoDW}Zc zB13cfMmo{4Awo{bMbDselAjNEf?6q&tp`t66;}&g@1rJ(&#msu@F0zKijV^36XY-hXEXVd*#}T{~7ONs<>4Gc+M{TvthQ?pREydL-5G}P%KRfO)^#s~9u51Mg zWZ`DOdiiYO#(<FHab1ddiNFTkA~wANVh-YV2M- z(wWu>-f=3|FOphXcHzG0d1;=~ND{J?L447xhAf}0f5c_896XVX%i1Zb8Q)S%CNwX| z#^9n3XVu%^DCZuk4YaEF>h03H1pBRsZt*$}QR@*ZtkeVk-8xjXPvqJg{Ds>KBdUyh zf8;@o_h@zGwG{_?^Noak(F+&q&`WYz4cl9n4zg+DQIK@yuc@TpGXGfdHJja(z;;43 z$`+RXD~|kRy7A>Vm_g(ZixwK{>%@M+Cb#y~4_cSGyFO6ZNx9?&5M*)xQgHdW=8!+N z4^YQYOwiwEqPi0!448~QSA(~>H*tG3FB`1l`MzqRfN zOKM^4+bnZk@_&@~zYFNz&4aJ6e2HPEKLwkhF+92a)AGd794gP~smHDhRf86Fh9z#U zGL^LLHsw24AtC37af5P?v#mcpp4sfQ4Gv~}FGToWWm1#5K$+z5%Z~o=GfQWsK@tnS z+2;&Q$izM;B3wDVeI-yZNvEL83vzWj=VE)mxDJwmiCC+&7HFJfZ_nf7GIb1OZ0Fl{ zt5)6PaV&SVmNHd&lB53CiR#G*|HVGswI;1a+-m5ZCG|aypt-+opPP&JtV65^m)@=i zUEgc%JB#To7GHR(yl$FXJgDmBk0YP`n<4JgR$NUGE3ZpXJ!&qjVhmH~E@rcR>(|EU zgmIN+Z3TiTfWWkrM&S<;iIJ3;)#mOc+oisxKmt|sMInCM<9a6)Qe*`2%t1 z{TXlCNyya9jMsW|ej4_8*5QZT1b_PldQ)~!b&q&av~1d(%#HL7w8`;T>z)$>Z%G#*?apSu7uREld<*Xx{$+EI_PQ+0V<_nRZNP zR)1NBna&w-LIm=2!KT}9_{32~N%0}-|MaBNkxOa6X{_E6)O?7_`@TVz{Ddg^_2po> zT{RG7DL44V`!IW#5?t`P>SMfiR_c@OT6{|tA6T#a72o1SuNXLXFwUm4Gzl0sPK~)U zyqGer>bmH~#ds%pbGqbtx_-ntEuIK1X)bx6j5?&icVt$x^RX4Np-mWWq_sZr9+iM; zue=Y z2EM*x{lM>%WY^d&HgJHf6U|9jNcDRD`P2=!kI)Gl6H=J2ympJVMu*uo(~$$Zte1wp zO%3($UiHhLzQ6Bv_|yCHfv&sQpJb0*ruao8rx~u;`Iyt)5_0Zy_WDo26 zQevyw?8H~g6Tk8WH9MNPRl5Jti8Z}vI1x;m(dm`1FGl;YTnuh za)zye(jbcV;IZs&^5a#@ZqW{O!!R#*e+K`}m5W~+XJ^`0(IMl64`7oebu|ybS6`kT zX`JU3{DQRp|ipK-47; zQX5;Onw1?3uaq{Ht<`*kAQjYD3ewv57o>1^A9V zL~%_ah#c!g_FP2^=Y)d~9rywES*+4SP+tDtLW-@IKt#>@EJA!`b^`c@CnAZjzd8bM zLca|YDIB2`?CK0#oz;0GJQJINTp=@}ziJ3YHDs4U@w_y8HQyfxhYmif7~(-(IIt?u zvtUvzm=T9hu1ZBJJ<*rp{i1rlbG`5;X&EEqlZ?{rk1-Z5d(*Aei}HxN50|gQbuX3_ z)fFzI`kPc$4%ukVATS-iuZ)Ozafl8o9iBs4y-pRXr7x!=O{!WUy2!kRID8plEr96+ zrtFhs!6Ay7i=w#=kbjd$tzVgtM_hC9NUQ*d7d^^_Wqdpl`}C3%Fm{|dT^3i(SrB$c zT~6v%GFI$O;Bd8XVkDSHj1C)%3%_nE-h*N;P8<@goDEaa5o5{Nv0txhg<@lJC|%j#bwROoz4CdCmZ=F7J>VZ?+%qvNCI1UWPKJRm zsR9py@!znJyMTxK^OXgR^C_{5bjjSjBg)w`qnUWkudP~i+aLcXJJ!4{W$_Ivg2+ma z@jre#1=SmV5`50WidYd?9eHMVN7(u#h2qC8?w|J_@7gy_WW!))E5yryi$- zu@67&!E%%MW|g(<3anaOzM~ZQh8pu%or=e@c?I3~hY5;If1KnT}Q4Y^sNU5`h(nF;O2T z`d7N3jJ`EPy%mVe4Qe zEi3w3_mkgaJV^35`FoEyI1o;!E}zng6v)y0z2t~41vYX-tbVLH8Twj+1xbUe1T(sh z#I}~48dH!=k5;svkA1JngNDd20Zc*Ta!(Xvdx36~T_t><_yQDR$6foX)uVv_DxV7GvF}6Kf#4Gg zY=N=8AEW;1G&Ne^eqfh_iVkg7;?Xw`f#n=rB16=<%1~pN(cWAK5*8psLHahHK#+#@ z!*b#UQ`=6Ycki7F`3&@*9)z1)&W1&b(9AY)UNL4c54eVVArU z!O5mLsDI_qSi!qLU+!R`xMG+GQ8l{jjaJkJ>%7VMMxQeHRo`%A?x+-72hx`@+!(y; zb_KrBbRYBqFLNR^JJdxUQth`bv^A@Q(Tyk-55iH+U9q!3PjZ5JZKauI1o4q-Iqjs>8&hTmMBQ_u>`1mS zB3^|wKLE|rj7N-bJOX!DARVSwiykw@+?*KBSNHIY>kHaxIml4hb3T$7&18JHS+JE_ zVi!(-*LGo86H6n#y4IoEcvmrW_bK>l(@C&NG8>HApT6LK^pZy;9m`HX^+*;2pYt0n zr>8joTQwo^B#n+B^c;irDmB_{?cRN9J|~pkNs!-jYD_f`lYZ^vyAt}lIGa+=A%yh< zGBmrp!k76)`EIW0NTNxp{gYII5{QbMefD5?mr_KgfXr-<(}8!) ztAXg0XpozEdb@PI+*kW-ktLllXx=O&^PgxK_m|Z7bP|d|$w+3CA!p11^nMWmL0)1c zdBoLR8mjqF731;Gv?AsYJg~%@T}pAXX_y@qv!xN!v){PFjvldUb0zYvi!IJI8A(h; z~>|-XE-f^Anh)+`Wb?cWyvVJ8$Owx;U}PdcLPZzMNVpmn=52Uox|Pa zUToj7?j`&)XpI*u5(0&uX`oQ#`yG7w=-YoU<*{icIW0Qes&Zk2(GVUgaqrg-Oz%Vx zJdxVTPtSiv$SlF>^Eay@w6@(kWJuSQwb~p4^e%xbWzO z$lb#D3(t98tx~~UA2CFL8%C2U*I)7*8Iq2_DCuHXt*}4z4!yllz>ATNGO7AeT9RfG zWbyvA&za0&w~LZW%G`}ePL+RES43RF>P;-$bTOw#*qN29hpDP>!0Ag~0if5^%NuUF z{y?-HNbiA%wwxpss*K~U)=Qq;0SxStd<7Dis&KoyZF5x91CoXXn!l997i3q|Oldh) zG;O?qI$-w}o_JE68GC~PBVt(5=c2^sMc_J?c!;v@B)l9wqpM0O9V}G}EB^Q;Vs@`6 z4gw>6M{AxMJIjU0@UWjMj5##`FCC2=RH$90Vrw3Yz~(4%)DLp#rPntivl#5y`|<@Z z!ZZkbUptltL>dG@4RrC*)-gPvBkTekfN`NaGOYOM&re>DH`Ybx?T!TL@eM8?)DPxR zMASSGLH<@PjJ0Rd&YzHB!cX#*Mw@5E5VA??eb(s9`+q};huUYv0ypSQa89%YvL<47 zlf#DuIr-P7Wf@)uMb1l2HpCLDwO?wa>Rf?KJZ|D0p*$X-z*BO}Ki$1a5zQDh~vV}2meQxm?HVb>GkDW5(*3_LE8Q+wc|hpaP&5XVrlhVzE2@a>RtwMd$atJ+e2L zX-_?2xb5}h*YpSC_j|{`Z8PL{is&46U%my|#ulD$!i?}sep8Va$3Um# zKdEo;^fX5bLTl82-F2nUyxGVPDp1E?`SO z_;;!lU(FJ6WoBu89vv=61cABEy2Zn5k#)XJJG*1~-oF@#Zh;>?MuwN>+EP93QSBWM zbX{BQ*ma4BMF5~rxF|lM(C(zevd=z!OU`n$Mce;tXzg-Fe<((u9CSp=P>J5$+hQs~ z(%L#D=VQc@~Q;0zMv3n25X>d;|ab?Sl*i^t4RGLinyN!HH5qeh{;AC$9gUa6n z%!gM6`##^kVogiZMHH)YrJ-?xd?Sl4e>9viqHwzLV#RF>%|U$i9_Bn^?|J?c(EtjI zMC92(4M$rTd2-nN#Fk3&>x5Etz-LM5pM}xAF<0X}WZ&h!L*&5}k#=lDG1{q6z_d#v=!{ z@yC<^=2!Gi2xZ=tFpfjR%UEhTYB||pWoy$z@W zAJ5*Z`uxJLj2$a!{iWF|dzq6C%K2d=0SvmY+gPwnla54(Ujp;zd`^`l1+m<*aW`84 zN$Jb$`k;5J)?b?n`|NO>1}6$1#)QU`hmbuP*4bV7u=NcGQpyA0{OdywMt>tR9#0IsW_i@YL*Y@7Jmq{R~~oe(SA#kg&v1lG+$lZ&VkOX*A|1;U0G4E`#B`1|8{_2*!fulpYei zy&~-_kt*`+pn5|}Lu)-nbmBubZASEo8(m?{(th=5W3O!iaJ#c^F<`B6tcSl($u)a0 z!G&-{0}lygyXh{7@krT5CL4mBN~ro@yu#g}ljC+WQk!m8#S`z#+yf&TLGjd;25f? ziFRltDJ@e4k!LAwKSLHL_9M|8WaB`TX~mf%t&2G?*jk9Lt1iJ)3-|hRAtFM5)8+pJ zMjHR=0m!x22!5!0VT`~4fN5Tb@+h*s! zUiz(U=+Z-sHuKt7G{<^VvuabyTK5xT!Y7m~@p4nsd03rqe!TzSoBS#(G{>B308pCp z6|0XS8G@s%Mp!pH*MJacMp*`eqwW=9QA&1{U!o3&uhC+OU0x8Oh6fe;eZStmf__AU zwLS~^a%Uku)a`y#$=xC3+2)J>;wBC0CG)s2{%>{PR(`aRpzbG{lnqV%wXOf1^i!+Zvw^_t)Nm5vqD|IrZHIQqDD-pf`1pyHpWEI@;sGr^22v{ zkm5gZBcn`Ug7+{{4CZCe>FKemkFoFOhYK_Zb*xIF6#tv+{u(w#anWZH*k?(iLAXx` zh2ADc1lUEtcawP#)JBA=8MVjN~=$@MdsPYPKvH;d=R?S^(pUbYh9gTD__ za4L9^pcLIrhd_|XH$Ca4K(H-F-G0Z5d0^7?F0#u0$zLLb^5IL4nL)bIZ}xxx+r+PS zMb_(hV>%;ed-@%~?m_NkiWhgn+z{Sc; z3=zWYS9d=b+jWRs;0mWKJwo2#&4hXY*50`V*yEEy;j0}Pib#>++NnmK|Mky$e-wFv z2KjOa(?bwn&@0RHHR;_Qxq_gamZ7|7+@bt;KdHk}2Rq^4na8|s>P3g8Ma#8di1Sc8 zvz!yA*f_xD5bfRJ&YsVN3ex05Z(PCX*OTEJzYj!^;f5p}aWRHmWYC10D*vZ<-xODW z5_bzgZG$=#pPh~K6X4LrCpbYlnB{~Ve>fL*lA%H!yS_w%V|cVq<{-)M@PZDvBnN*g zI0QXr=y~!sGg9i&kO~eRaC|u9k5%lq$jQ@Yjs(7Qn72)#67J1w$@>yoNZ_w6Zu4p@ zNM5@W0%*M@piE+yyv=k;-;fyb_gqK#@(dl;BlF&S{(sehphD9NYfsIImEDkkLVQh# z)5|2fqWf#Zbps{b@7QnPkXW3}&J4{@2BJUrC0k=czGd~%&||Y^+k{SyellT4y-yPdyvA>AI^v%C zJ5wHM+p~crl(kP^)w=7itAQ3R>}wd}OlgG*d#8=2iW>9L8KYhE^9IK|kYklF%x#QU z9JI<_*WxO>J9P{9Sp&n2X|Mq66bt8!m0dcB?s9Dun4?fCR~I$ll@ZSn_4q}K{Vrv4 zXS5WQh$Ztp{-DUhiXqdoGX32`LBj&s{uWrPeFej=EwY!u5i@szblxsY7&|WLHTQFJ zOHJq}c*-;n{S*PAgjmW7R+3j7P)Z|qa|#_NQ0k7SeqR_m}1`ZPW$L$jp77vo@E zz2!9y;)y>sUQH#z@4R_5o*GYsedw<0)cvY4X9CvSM$fYzM1->15)}uJ3OxaA0LO<= zvjl$trt^(I5x)BSI9pcI#V;ZRuBZx*pX0)e)9e{P=D|BgnUGQ8_?c?BA=^O1=BSd` z!UIy=pd1zlB7ZG;%9#MjWU?JsU}8hgGRK3rE>aL}w_)2Fq~9Vt-_(vD(z&S%){BWmtiT5jRWQ5;Cd1ZML!Zt5EyH?N{nZo7Qzg$eVFj6 zYJJR!8j2HvoDs&G9R=A$D4@fNPz0Gr2#~^cY3AFly)C(ZNNoDqx32r26p^xE11!Xa z)jiAt3A#JG^#@~avdFXUPs`Wo#hzk1D8ZZi7bJuS-}NHHxn-=wEWeEFaidHdzH~PL zi0xJz)veW}5FTp|!;aX_XP`fi*3$r4q;q|SIV<`kM0gC{C+_(E?;fbqe2zIcBgcm_ zF7|~hKpIYRNq?l^l`B~x2IMH{Yy}38Xo@F502WcI`ud4|ti)mx4eobQv<90}`${k+uH{ICu)1uaJ~T{c`X@!+5~rj#5X-3GSHIl1{Ila|=VElCFqKws$Oy0`I`p6Qm4q88Vzn zYG1)Q!&IQwf67kW&MLft7_zHqVxrL}VrPIs;pqO5>`->o%bJUfW`B@&+ zwK0WdRzv?lK~gMVE3q0zr-ueN8&WU`3|QOQpb%QhF+E`51qn(a6gMDOaZ8wwMAZUw z^MD4&HpO)f(x^Fn&;8n^dB5fS0X<=}@kfm5tp^*R-&W_L+b#96HWDLAlTleNnSPX6kdLmScve)UYxFT=wPm^W>VLS_m!DN@!VFo zSpEkF`xD`eFrqFPvS(L$JsC1jH1e_=Xpfr))jl4-w#$;Ls4)EasQ#|J*Mbp9JRcmQ zrNVYITvXK&F)SJ7FiieExqj8)?Up+uGWf7nAV-=#D&HqBtga-klt}>0=5eETt7KR+ z`IVn>^i8uMESoE|hSI9IW>#$NgU@$~d5 zGWemptB37jzH;uM_yqby%p9Y?Oolxrp~vZ;neIoL`hmc4O02)`X)&wzYmSJ9RBMNC zm%MdHmQ-?h(xUE*u|8aJag>*e&v2k)5ye zXQcx%0(VNP@sCymmxz(sb8Pd3&$?Y_8`;)ZZi_R zL*wB-t>r4`6J5K_M@|e{iNCSHMYnorb^uIa{ao{v zC%>l0K4xwnj7Wz3gCJQ*z=e45VuS7NulyiY#XhP=Q`?WsuQ^$u(2@_C^ZhZLMA$%#z9fRlG-fdKo>_2XTZJq5S!o~6JJwT^t-eWs<)OCiM+*3MZUE7o&8f>D5N)7m?M(Gq@H;!hukfgS zs?BcBM!!@J$sN4VX0q&d0zK3wuhxQ?gBiWyLA`uTA-ptwqo|f$K7n<(IWmftAwKwnk(S-q%j7<`Z!!N-!?2shTBdyS zQLq1`c{6HXgYIJ7D3O*mQ!Y;EhkL~Q^z5YaE!jtGUFjNvyhRXqaw$G*S>nXY|y>~784Iej+QeGGE5 z4I8w0`WfwyUAVy7(ej-ahoubjW_y05y(-so^ZOzRZs(}Ht#F~|`cNqxm4tVRuF&F& z;R=62hTjI$9c7?o5jYhK)>0guI(2EW^Vh>TT642n{9vI5=1sjmf#!4>j9pp!T90I$ zzx|ENiVm_K%j%-|NDsr#QmB@8vXp0v|DP7XOR5Z(&2Hp;qyR%W)6mmlN5widXzf?- zElYn{y}UC06@AjRwm&0X5mcm+eisuJ`48s=Uk@?zY&zePg&uKZgOq39S&{XNNSU2^ zL&!tX*1+GdU~%HZDkcHgF(9#2-0ktb8#`kCrv48gD$*pHM4|8_y0{BU1<02cL_?U@ zv?N+*fR84t{q@|xD!;Q09IAI$zYSm;Dg$2??XECm?}X#Tq4~M;_8>YT@k4s{tLaVO zyLXgWKuN(!VGv=RW7$TTAI3txcJ`GVB@$-8Z+m|M?tRR%c%ns)yJ5~o3o=D<8e)8D zoE&Bx@vQHp?Adas%OrhJl=H|TLHx{zS7uggQ77c&v>oC8o z>AY)@o2pCG*Nl?8z)0QB8lAyYCuEG_u_$|GE>&6yBNVU)0$|rgk{mVJN`^P<^-W$s zbqM2V3mL|?ym?$U<~Fzfbf>0z`(F=mf^`hcTQ_ohvX1ZH%XisS-8766w*T6pcqS*` zzkFZh0~<1q@8g91)`zXSRVh)-R;HEXu}g6nhi6~O_2Ae1RikO+dYXN9^(6 z4<@MRmm_ZG=+ z`D&y5!G)`Fq5>;Z;NKL=C{{dr1u8kh}b|5y+H~`i>b0nJ+uU}f{M=DPjM!#72(D93P=r5-$Y3(=K(S_vQ}_ZEKC4^+4Ac9`K+fukPY%V}P;c>qvj+3qwG<+!L|! zHl4YeDUP%M8TnY_Y#kFe<;laHkrhOahkXdsoT4Z^1N(hUh>R0PTbXir|HZ_+;#1Kn zYPO?mqAHDlE#He{$oPgg(mu*;fI5n7J@Tt}*LoG{y;o9RzRa^cx7>>+!DFY+YjqW= z@)5~N$2c`OpX>Fre_Atw>dE@c|22uOAg7R&6)Y z@d_EJOMl`Qs^A$UI+gSWJr~#t~&Tte?(&?dYjrL?u>#H;yL5S^ouz z$)>R{d_Fg^MScGB!zwdTAqxC|nj`tu>s z9%braPU5=ih>0GwsCh2`3==i=Mvcguc$G{4ijoW%dmg|j3~{tdBSdY<^?wv}xKEB3 zV%}@$#D5XqaWNU0A@ZKjrhOY3RIbE?x#sHl4R-t4!!o9p{2W7rgz zN@iI^;CIPr4qfF}5kZRVorPy?*>D6hkPW~b!3#=g8Q6L`0P0qOLN~EHe+FM8#K8lZ zpNh@uCL2;@Bh%9hj3i-rY02}QRsH%dX;V2SP)UFBDshXd)u&4wqd#rM^x%e?EV40R zLh>Q(QSg0d+qJAJCvJ(6;-5UUFsxxePYHeE$@<$z+dU5w^??`p3DkB8oMVHCQZbD8khEnf=aKa)PNcM{@0q_H{elbFjg+q{302v z{im4*@*R6vz~}px9QU&W#(+mIKc>SWXM$$fB)n4X|4c=2MKLXX3T*hUR z`yr(k%~!zJ+R*vR_%{zq6}j1YrJodPR?60$^r)GNl7cy$Og{4>_dlR_ug=NZ$8;Sy#_cjHM z%|)vlNdvL2&n5m65eiKLxthtPz4vGVfnEG{OyUwLYTUoExZI>XuO2L|PbhH|W59co zvV;ISCe_rk){0iLjPmcVh<`^en2mNx`moab?_rA|C1Gy5>_FL>bn(w#GM2^^CrtsI5Cj|^L8Pu4S==(9ml};H_ z+jEi^=|()f#tv*@q$iGn9xQwo(LuNP)qXFI;umsZM^KKAKcKSxsR1si7cMI1a)7)r zatl%UOCKK^6>yOUBSncC!gVJApp*Gw2dz*Pt(M2VA8*5%xmLNA$0kr(W{ZfuyObO+ z(C&Bkt-Jhf0M?9JJR|H;=n6m)UL}S(;*>hSHEk$N70%%LIku={VseBzEa8OmHdY-s z#R@J=)e*G#tCkyLolu;X|LTWg}0 z4eUA#qE9q>Gz>ynm-aK7{U(91ZL2v5j`}lw=h{xG+H(HwLC$$`lca4qRQD!b>tZJi zuLg``UcgBt6Rq-^(!53HD~SPWQ>AyEK_1>3^5^I_IY#9^*rB)yI z$FlD@lt0@W3Nw<#=(9+TR9ZNFy=Kk}Y1mU39gNUn)3?N&@&>J?vGLi&5$?f5<&SrXMmV zZPQ`z_iYPulYy&v;GrnOn=9`h{CpKtwQqWt-kZU7uPlATlMOC%PbA=qzIPs-1uK^l z?yuUlqWliGnNXuIGe4F>Jn!X3Vpd4Vv3yIXOWp5!cood{Ef2X>Q+fBzkAkgF0m?C&rI53Z-AXbUEo!dKql^o-`MB)G(BOW@A9YH<|mF)O`OS;{~r=n>mfKwT(ynjkVrV_tZZzc zW~6JBSW&ZV(}Oit>su>2CN2vg@P!0&R}Gr#GD~TCQhgHG%7UGoIBOmq*QCRV3J@BI z@DZ|u{kGx4Pv~)?rT~8Ci;$sM>@OC5<9#V&vy=y;8Xo%F__8yGrw2U?i(Xxwe}}-_ zEG&m1oP2+1ahn;*4_I`;>Ah`w36R&x-;>-fn_2{n5ObA91d!A$Fg&}6Z>m-E^;=DS z69l^##P~lELFJu%0OLHD^U@u(Y-D9SeNeX$mJ=)pUKTDG!Y|LhaZPCImPVocm5Y=L zb$_29PwwAI4m|loj`}U)!{xn@#nPL=ANQ&)Z{R-Wt;_?Et7G;$cA8%HI}4V#^ySk} zF3pNy8r%NSRig~y!j1eN@-%_&XeaLCbFOvA5^4T$VmefPRG zTtz9awP$>pCcHlwhvAav#bG$RIHR}c2SXhy=#)kZ*xKb}+aSHZu#|h-Hq-{6Bg0k} zyMyQvi96vEZo})(_BH_EAPGmAUcSUEP+uEZ+8cS8NEfyCfEIV~huAi9w6TK`_u@6T z7&G<^fC}vc#T##`UYn0@vsbnqpuv z)|jXx{g%rq5w$e`ZI>aV29OP5DLl=ZS+7*wdG$uZPGq&|2mm}Y$&wu2Ojq%}A%P*2 zECRRCzw)t#219U~=UOF(GcIpErYvCZ-FbAGKd4XQq0@4{2y7J`xP9WX8Im)R|6({wk!#&<$wN zO1SsQQdX7n_|hZRsR#3O=N6*B#K=6yZ=h`{)C zo2Jz{nrAR*zKaMSkWE7(Jt8qs8GRxwl_q4^MQhmU3e@MPCuV34{LT}rYxkr~-IJ{n ziHN00@crca?CSPF+j(BX0GZQj%2SGO$sOTQSCqk6!bS>J^Tk>XK@^=Qg8t@8>xmzk>9D)xncu*?P_K;TT?{j45PhfHPA9}d0 z;GiJ*oC1V*rYy@>rHXDoZrk!Yx)sJjGkeKC4!;eLk>$vkNUi(0Kf}WV8a(t)4LCkm zKnElwovkEzp0qda#_YZ%c+IV_N4Pgs;QVW@7~N3VdP2p1=?WFD;WWXq9fJx2vO}u% zil>=$%-H!qSt*=WYzmNLY_-U{C&>Q#2Tzc$mS5MU3qUbRXTaL62U|8&W?LS>u=ZaB zGEROU2m@Gb+5k0{b?wskD@W8gXs?Uyh!Kcuib%0c19Oj88b60_h3_JAAFULzV(&-E zkoMr4xIeW%-AfW>=-(?-&HN?#Akh6;RG8O;bTEB;gzS!?Y*-E_P z!ZO_e9`9_^B!(a79MF6_5PImwh(P=5@eo{W9NE$fNS7eI(zO**v1WdVAl?AZkL?7PlCO(D?-q_lj4w$3Zko zI7$^r7SH!RX=-Xd@e4BeuJ8KmC;e4d(J=3h-0+?s`K~>K2*t#wcdH|eqEp_#15RaL zj>nPj5~M)MuiGcIJ?3NCM8sY?ieqlQkEgE}@AZuajfv zxy}1$$ltCj7Wkyap$M>qeeJC z`bQ-q)DQ8J7YsBD#H7jB0DB-f?9h8e4kn9wx*Dfxn;BvHb8A>9aEHEazvpF^BXx z{%6^U@=z!bwSSY-r@6L2jYZe!g_+e}qnD zC>X46G22@FGuOs!6 zYOmUaFgd{{GuD}F^ zs~y$wY^93OR|-KT(}2p&ixT|>^InUBw*b#m5ay;?v$a{(=GUkHfyP4BGynHe#i;tN zS7z>-H&!$;ll`A}HhXdfa29l-d$z`5X4#&dF`KeAao8`a8p@TM9?%ho(@(q&2ui8*Z&}P_1ZI>ttTt;|UFV7Rf=ZzA9gB zhfxXKN^``lY%*=1s6Pj4knc6Z^PdJH!Gq);R20&@VJ8afyY-x1vvb-iaymVel{#&j)ky{Bs1AZ2=riPYy@FO~;+xl}ZUonQFB69B z{kBif%-Qe%ub#Z&YA;`eMAv`E*TzCpKxn_Kb8*n{9Ife z)#Qg=d!;CZ(KfxVh^@bZySsmvbI{SLgD+UCbE-X`V=MA^$sjN86*InE!(Sqgl$$}>h8WRWZS&@OrE9ZXneZGBN`IpDcRz#r z+%(YP{Jj|Z;&ojkI-aV_5z{&DtuG_6+Bf+-jKg{n?ybN;Pf%QxF3kkXRI-4RDWS2J z;Bad(@Hr3aP=@Ti3st|y=0WZGzKlePcd;_AoLyk}7wEh7;zdAh>d#G){fwhDaI8*Z zq5IoxJMg7Ae?%6Y>k}bpf0O|e$QGamU&@;ClaYMMz$qK#1^I#F@#m%MP|1u(;&H}m zv`IcPSVvq0%3D7qCByMj;F#mDLbh_UlYGX3|G6#sd@LX6D(^gc@`o=%oewIR4DQ2D zo~F{_GC`<)x0l*{&N87s=vxKhqCP&u@Q8ig$6RxlEa?{LqKto6J&QjZhe&>9uL-jizd>FcJn(G$i`|-ZJFq}x>-4KzS|KSVp zhoKa?hbf*7iOAWrEap-SX-y;#=l(`N1+Jy{?Xi{G6xk2oZ_llfc|UF{a(uP7eFwqf zM8SkDJ;a~YNs20TSJ@LG{5T~`E{zaLsIufRf8{~=MbZE`q0e-;!$PvF1Jp`{3r+TN z@$rgt$1^|5%%+{0dBTCsWPflYsQD_?EFZvrwc6Qc0G&cmF{CHB#!Azab;{?af})N? ztC8cBkgyb$P+%P!xCUj)i;&<*Y5uf!Xc}TVojGKn=Ff0M?uTTeTHCjhxi1rqBm9MV zJ+U@!6m1&mA{d_l>$ADVEVwsu00Yxj7{`6#D}NPrF;N_yhH!+a{+UtzUCW=yVTcm9 zGVed{p(y#!LM4_Ema<%`ttNF~(aUlf3RQL#BgL)Xi#q-JpI*-`4c7I4P!2aKBwjxG zf&BD?u5~2XD`cjK&O@%P!oAeI{s~0jl8MF zLIOOADGxE{r^)u(&xy|zG@s3k=Hb-7#hd=!N0I$a zt42MI!7M2aHDuVDDh80QHvWaiehBF>#&| zj!&d)sp}n9X(k&2NG9>h#+4E`ePNBC2I35jmy}z z=VW^dZ{9E?06w!FSL74a1ZZHNMT=x4tqJQ+XkJP>$STRa23&jxqRHNHoLgJA8B)2< zGc|fYaU^5-Q!WLam@dYFl5^Om{Xm(h^=YD*`A@h) zg|nlpbOFz#pYw1RTBWSe(8TqD+O?Jc<#~JwDbYey#W1IR7oT-IZFEDQqKF}+Jb>!Kuod-Q4|4hC3JUF)O zt`#~(g*6^225~;3&auSa>)sHbq)AZAhBCiSB55z+8p-w+L*FC#=0y=c4_v*)k$Q&~ z#DsYr@%Nx1h|nhrWxA*^Q9=8M%2b%nj%i*NSAsF3#Z>exAVd^6+_p2uGEe`DI_rDm zp6m0XI7z=Mgv(tf7EVtmk&uA#Q_Xg{OB1HBN!hTeiAl?N_d)x?GDvDsj7R~4cteH= zy*E1jCejp{{?jrh0Bk1UjqF#2e6zwh$XEdpJ;7xRy6_ED65UI{}`xX+F{ z^2w46ib0_Y_V%FkDa@&_{KbyDl1|C*+V6j4Ulv?}Z0Szd=M~|EyH`IvyY83VC8M~a z2QtvS+E^X8RyoRb{I~f)XwK^0k+>)=MNH=eIg9&c7)of@L59i*zgr1vx}WduHIU#h zPD>S}G5SCz^y_&L#g}Wo|EC2&2h@e{Tpk<>_NricFOmPG;0@6g`U<`cB|4;D-k_2u zTD;)`u*)@Hc!OJ>T$)fsNIhomdH~aBprEtWmCzy$bK2u zMLlYAcUZ)~(2N9oAK0EFY02+pOY+0?7eBZ-Cb_6}=u{(>zXa&~1{k^U#gIwI8LU#v zTW0j)12L*lfEH%&yUz18%w9~epf5R$0VwXcC9BLU^y>$B^`5A9i85$1d;E#DcmSy%)21}jL+rQo~Ozq-&Ioeg<|=fr*6J=K3;4XL&;9RK&&>GL4G@cnjb z^F&emkG*~`UQhUboYNdL)Xc^ z(U9{pnn`dcr+-xp+5e){0!X70WtKnq41N3ha3wj(WyTqaxzT=B9bj)ocFw@lpAjZ( zzxA5Cr)xy7m5FP^K&=bePh|k4kwVhihljVuIdo^CyBrz~hQvI*PHM-Zz;F>6e$+RL zKC$M)guH)uba?*fQSlHJrARii-`I51N))X?j*QFtsDyFTdHG*UD=zm;(6!eA7?P_c z_I}fm*#t>mozB&W|Q3ear9Eh*I}s-~n-3wLk=Y z?*5sGz^mEl!-!owA06R-ON3ZzRQR%-&6cUyCMiG@p%lJeur_(75KsojlVgj9-EcA- zkQ`YCmUPkmdI|86h2ZL2J^g3%zwr$;$LCBucUyU(dhYK)Xmo*fCi|%*y4Ux1V&0h> zZ>u?#S@32%qI$8tw$&p;-;X!dkAuzkw|>NQU=kZ0Y0;B=AO8(oT^i|&&%6#4QqfZu zywf|Mn2zUumiFh-b?SU)chF!=)SA!yn#S;IDr=>(bsKZ-btWk$qn+vCN#X6Av!1ul zxUdiF*&#mB9=B($o9a3VC>avBjFXG~)xiSf*&889uu%;W#JZ6%+D^6&h}tQy*zesi zR8U+{i9+|a(fHFnQ8){x&-Bt;^0@ptQ&|@0hi%!UM1+nQ*7pK&Q>7Y{mB;H9gCWTv zZJ_ak@|??U+suOiLS?w%pfFe}yR4!k0x_NI&)^!9XS|CaKGNKv$?~1<4oqm0St1a- z|5fdLXx`)S3PuRa4(KI#!%!zGpSJbJgS)^_$s1c&_k#aeiUz+B`7cr(d1ku8bM+`e ziELc5)#tZk*ha&?h-d6`3cnv@x3=~_ko@LV@pvTfjlX&I=h?eWpkb|XCw;GiwtgbLCw)(v{m)mKSyAQ^l8!J!iuPpzQI?V=U^!?zSo_%3>Nl^{bs%f%(fSOVzE=%BpXB6Waxe zla(o5LyERZQrn8-h{(mM((N~%AYe!RbU@Kyhr=pbuvzS(6_*1G73#;NT@YPJS=GWy z#&yM7u^F8t*|oX>tr^?LXL{DwCyIXGOQ;0wi^YT8%eFN3YPyc((s{>E9mZUSz06mq zsrp(R>jxbIqr1H{Rjm&s|66?(V)ffghnK!_Ta?)$h$S0eGnlDA5Y@6h8Jg^`ROtM@ z-r#p>l&r(sBa7~o&G^&x6?Xok<>gE7sWZJLBI{ zkBi6#7cI9pDf)cbn;D|&b?jQr$RPJS60OCa?!DAXT1`S6{tRpwXw;ub^`);1&Yb1+ErJ~zepp5&(jBk}V&#`ySj8MmGr7$OwKqJH)qUwLPCTaD1@=o%1-k>qVHNd=1f*1t+LE&Ofml1qW5TUlf# zo1_5>M6WqZHJXY`I)fCELDs3n8sou7c|09& zBZ3y?UrH@;hK4#JKQ21@Pe+3|S@ov1U|xyP98YtD{cL@cMYX0Y4?1senByJ?rnxFb z1%AF!7@BF%7Yq7y}_{;e82h_=oO`OMCLdCtIzwH}MJ zG<~d=l^eQ7H8aR0JUf+eN-OuqnOjikp2pXq_=*3)VNWmTtN9u8;f^m2Z1j-IN zToPnf#GHS2h!(+gYB2%lOu9{y(0eB6!n774h}^7lNxDDKlo`0LI@(K^gCQVv`rQjfwX@Ia~=#%&i>YC#b@!*Hc(-d=o z8?pG^SU^nMiIs^Ddg+>arx&n4+>S3WX*|Qeq*UF`(}gK3VfuvF$%J=JTWO5zwLnZS z_k^GR4m#y#9O1EpHMBv&V(3YW%g3a~$@04)m9c)||D^qiq_~~^xh85cfl1)e9&YDY zRM4Qc3b;rMtLshk&iya+>mRS3rP>BElu%K`h2muf=v~IWavkB*5L1#DRP?~;S}-r) zM#AmiK04*3hdjeoGo#^^v%gqo)kMXGFd?2@*#IyM!2^$uL;dEE?d2EwK%uu^0GPyq z!ZtUrxQ)$k6}A-%&wGY}UitEU$@x3xjvzNUH;{n?)Y2lwKso~tBqCNq=MBVbJ8~B> zSU62sxK*wO4ZSyT7SOShz2QTjbe6=_P9NJ0KUnY-ZwT2f`*9rR!(?cE6cV+QVhv!7 z3Nt^WPEYNF9+5SVPTOe4M-s2l{MDb+VzyjiL`N{(Gcj?ilUe@G2S0yi`AFT?PC|f! z*p^ZE4pNubIno2Uqpi{rS*B}f5v{tls;@@cqdrMXU2Ez@= z>{}M|J|cs87d|o)qxMYGkp*j}URdPWYfu;7Z zxQ9+lcl1>`AYup^c!|7y9_*!qtsJG^BZ3GmH+I(xq%$S7{6hBgT-4NY0J%;OXT!N+ z=bXKk;-=ipy>9_iK0(>&6cF(G&y{WO{EC)r|xGV5>E<+ARxF$TY zbyK;74xRG(PpnO~EsOiUNmGn{@^s_i)9Da&%HOjhNkr8yTHW z)$+|#SEOD5%}>N%kT+evuNMO+Mk!uRWxn)NF!sGth%52k(|KY#D8>(zb#F-*=(Ax( zWVtDrvDQ4bnv|_M7mtaMmgP^ynXvv7Jn{ab2zN~o*|Fg=kfm?dQ}>qYI2%d(mfEd2 z=iTa{o>NWcp68P3I|IPF@$lQ~gb*R>=ZDL$`6Byw9IW4>XGqtNsAsBO>d9AvJTOWB zrqHrV3rt2;&#$cO$}lJ%epjG_8!IR}>DD~~o~gr(Ai{4C6CU803Fh}u|x z=q+qStJQS@6F3;@lRw^nEM~lqkJpMy@plG&r>Z;dBMg;5t)Jri+fFEJBvb`X$RmNa zRabbi3r)8oM*fS$XR`-IkxP%6(?wF@3V*YSa~tXZg&|_8-OwrCnQv^Vxm_2TvD1w9 zBxd&IzeBvE`6s|xS1f~j1$-{)C$?Pa^be8g5`i55ynj=&APPw)?0l@_2O9|#?uQ+1 zrTy*wb<14g(a*W2@!#nGXkxw43O4``p9ZhY#TG?Au10hJl7gQT@@A23VdAh z_}=Bri?S&OehqrW(tY4?N~60$4GxjLO`RHTQWs#oJ^cE5JWCtn5Sg(TmJ;NCml$>X zYE86+QwFc0{iWP8s$5d0Jpc-xM-bt2bMk`V2$9P0qmPP#V$jV9i|CV%OD&+;ukM%I zOjrtmou)rZOUDqCyPuOD_K236w^WV|vm*My#)P~X8SI?EIOtWvOHVjuLYZHNrny7i zlyOfhEm%Y=!f%FizIUHt#j<$llrT;#EFbLmdXepfr8Kdm9%ULU3|QqUuwO|Rs`SYe z*hB&|aSSu$I95TN{fZ04K-#Z@i_q~tY77h^8h#i?)HP%@kYES%2^D(aWh0p5Ch;p5zByDD>G^4ux%sg~6r+T0yc zmF8p@0iMYHlCdDCvcA-b`PAk3iCY!oC}DZ+<3$9HD1*G+R`MudHvpjw-*pl4L5OVyItd7q>?BD3+hWadB zD_$E>(wHO^f%!47PMRWuOVH|sp_vI#(qFHbO}uf09v|#*Kg{kVFqXs%K|louxD^J! zFXT)j9%p~VCe{sd+6|J`()r0%f7vHi26QEAa!fhl3@{4u*YE_wMD8BYiUYwzZb0+TdDCRG?dOyzz35gH=Ne}2F@QMLKMNfr3>GgRCiTsTGspmuUr;^@SRQKlOzv!F z|FY@FVb-hK)inHkzv3_@RD(B|dUoo7F3+}I*JkpmzH92p)`le~ur*p=ql4R5xz4;= z;05^r?jry6kKns3Z2=7Q#Hy}LK%qPM8^a50oALTP_;Q|qY&h`n4w_m|FqoK-It*u2 zqVPZ^4Ms*b&vZR#n!7Y#RJ8=PP2~~+dEd=Gt52nX z!S8*jX}g9vxv|bD->Nm}MUPcl@}Sa+*3UnJr_H#5`HY(Zln%vi2)*jV~rC@hxgBh5~qv!#xJd!F6JA_8L73k+)be{%82N2XLy} zHANl`EnqeOe2O#pNsh&z>`iFkf`us#BkK4>_oKqKra?A=wR!^L53jCTC%-zT@Z?>w z|5LxL?Nk5?I%meVeL?%}3kF0AB{HSib_jNON{94Xw!M%fGsv)pdbRfst!iWrZ49j? zuqL)KCbgkqJ^YyvdVsv^LQ@6NaM0ViTz2eYBM>rW9HpUnMjNU%GWG|7aFeP{0B@SZ zKr)klr-eBxgBnQ`etKgxL3B!D+G{>TnU(-xJLTq>!s$?jLg#OE$QEZUy2u}4SW1k1 zch2$%;5r_5-el&+{j12h;bjlT|D#IneKIXSJxcESx;5?QepN*2$4L}N>IrBuy%;U= z5s;$JX5yKiabcMer$#}I&+HPTM>xpw{kqbpH+=~g-NSxNw;`}I0zF}4^M>jpo3s%y zgjI$Hf^LGQL_;yl5}0|0YMgof!!(eJOR=CpUEa({GT^N#(;d@(YCdsEe7zx1NRyWd zKul)AKv5-3L;kj`uGl4|WL{_QKcbc~>%f9c`LLM%qCk)U`Gix(ADJ^EOY{>J-|t+R zA6oN+ODsCoawB=R!PflYE)8B)q7#i=mc_b@lTT4k`(%_ql{zz*^EAfu(;48HzC_K+ z_7D`RzZ8^sNAu)=O29-KDu9f&;6-O|eVYboOzhg9kKoGc#PI~MV+%J19BZLC6msGZ zpiFUADU%h8O~$@B8g40t+vFZs3ANkXs}kgccqoE+&dL^MiUBhckLwN&AHjuM_derh zL;UFqdqRp?baHyed2S~b9R~cRhfWI%Nnlq1M6d3&lmM-gw`^ke&u|U+$Hujv zzUZcXPCNaITd>B)O}EHS>&-%eFw}I57SZML>H%(54z3rdb*{DL$|gC#hbRPcJj}LQ zV7^jiO$=Vh zd;#`YvLD4V=QZwZV`Qtoy9!h@yPY`1xEkO zbQy_Nx}CO)f?L`%UCbhd`DeeCS6#kf_zwnflRQM%HpW7*RFs6s={mGj7qji72kGU( zC49-b^S=a+GHnOEyv`x02IznTL4DUHxk$-HftNYTS~~gC%(NL_$PQX%GvL)|96}k< z??UZfVVx+oXV>4Y9xQSUcKnv-xr*BZdu?I7xCYXL16}^j>=j=G=b2ZO(kqBpPkQ~< zavwzqkP6G7p$J49-T_Z5`^ZId*fSL3vs^3+t_iH_kd2`6Ns_7&aVOr66+lj`Cgioi zhUcYjI^b?4>P$r5Z3()i_D)opZ1^jEI)M}51rxlQkg~ScXogE1l^*@NlN92PJPRBx zHBrQ3_HFtr;bScl62Hwz@n7fxEk5n(9Iwx>PLXzw@{dc ztt{N_0c%>>3=-dwk#8#U#2s=V`P7zKOzUOm*v4zl+AU$&M`DE`hh!o7gmDMbNzB&Gx?7=4|4jD?Uq<1a)j)>{Jo~bP9pCI+9qILvdovgkLLhf+H+4y6HgPv$Cv)Q2u>_{3<}h7KH6BQgDmlvtjpQFMQ85 zlwY{W2OG3CAL3aD+yf&ZYXK;qYtt7jyv%}+DxTJo8Y{S8GtgW3FFQlU6EBT7ft7}` zUr1jf?Dqkw3LXd0O--E$N$ofm5wspw7`EE{Mi}FjCST878{nwfD;yN zm}aq`^y;e+Aj-{)-pdo>D_G1D-2mg$GcEc`{DsANJ$4G_$cJASNbJzVlF@+k8N0iv z%IChoMBK|(n1Ea6f|ny7HG?lupK~I=`(*%0nV1$#p{IB<#{Z?oYnz3ec3mKA`p%rc zg~L30_o7VY)$jXK;!#!@(NG&_$JaQ_@PqvW+nqbSDiCcf=X#eA)dm4Va8cFMzP};I zG1C|{-uCKJcDtl){@w9zJ+P*6xCKbh)BnEvAVuthLZW0tcyYhsP!`~MX}$6Q#GzdF z@*&=E-7{jplnW%vFD6G3cYqrQztSZ&>BuVpDM32wGdPT7tOL4oT<|3Hy`gWygS}UW zVA~Z`SG=z794W|m@a^N#j-Ts%ko~kJBVM5Xec=x}fF!tvyhEWBu6>L=8pc5MdGO2c z6EFN>Tu6z`E&CBHjDT@yv;KCc!<;l4u3p&!z@(U9Pb!7Un1*1@08LMqnA+CMC#0sx zj0ER(4>A^)%}%r6Yfn~Ud7sbq8!1Yj~!m-765V{BhH{wAR#jHeYNl} zK4+kK`QcqE@P#}9UvrQ0gV)R4Vi3*uIxSmY zVf^zFnws2jVPwuwo9sdY-*4@G$;)Mvc$qy}hy6->mnyN;)h1`bu(3%<$DhvN|7uJ>OWDKa1y=s&vu#&%NZI zg}(s9(W>V5_SSo#fL_ydz+C{)07+Vkc(l|t?VVjc%o2G@t+DEp48$66Y&9E=|IAhW zBK3?#+mYQA?&b1D88-Xlyik&-llxV&P7PotnFw4TCugGDtn2#CK#_Q?1-xmulq~UP z>kE;0XbAdf0-FXRJPTBzzqdp0Lg2TIf=OKJFR#HX(q@ejbd<+u$P64#d7~~I)Fc!N zn{W;9E=RsbLKD1MU}H{J(hf%S<0C<*HW^nGo}EQsEfu!P4NIM z@fTdRj?cr%VNVYCePH79yLzfpu9<;yk@1E6r;*~tRC@eX=|f-A|M-nb_>v8iMHWh? zEzXRyr~3g&e8D!~7BajZilPEkgNN>>B@Tm*sPFw67$10DAzmJ8(fA$Q)#>73K<&+y z+OieBdizTu*!X><2o$jE{J^CJ%{!2oqXL4qG^VO&RcH@sd~pf1{pYNYm-}k{>Mt)) zGm}(($osc$zOh`cy&Kd2iiXl$8!923FHs)7hoXLukW@D~3r0X$oU`uNX?aOI2Vpj? z*k`BAy|+9Rg4Y9bfo~<+C~esP^}^yWS^J}t#OX{$l{;U)Zn@v)pqe&B(mfcHp7vGn zA$tvIreR92zP90Xk`(@bT7b!m_Pb@O$2hQqZRVZ;YHhjKW5){Ei^@W7b8lojO{vCe zX*97yius;>919_Pgy&d~Cztv{_pGNhpT|dypO%T6fBLGWOogN}wJny?Ree--x{-R#fd zmN#O7IfeuDstO#%;$N9fuDnzkcqJ>KGg~_K=3R$Uh&KCe(Fw5s9W&9D7}UGaBr*Nh zD0Q73d8kuawN;q?;@Ca6KWX3BI&{1v~0H z>}pOcNr`HYlM{yYgkPCHt*%#U-)zJ+cubXk*uN((kU+WYC<$)D;+ruipqA+{&?9fj z5HN_-R5~4Hm!8s8b(`!Gd9~?WmVVs*4^6$cv$RyLFuCZm?K3G+ZqlG4DG?Y-i;7Yx zQ9+oqZs#aNDb?C7H#O&=>O-8rZ$^C`(+bQVp}`i;Ca1WzvqBsaqqkIe!id2E%jRH0 zN&3z)mvV;ea`Eiur8hi)^;>FA2g~Y5H+r|b{(D`ve`bPvOOWD42l2ddzlORjJ?{58 zEjszga}w&2DIQ2R>-NmOgO`DX3Cv%vr1nKD$$-!;P_jgq-I5|}UYR8G6(F|qJEluiXf!8qA@l@+!47jA{op3didu(LFN{UaQqKmm`e(0 zzrqiF zXP_$(85@2n)cz&F7W*(EPRxA4G>^-|dV#F6(TD~|kK*VYHop(l7=f$mtNYebUVe z4d@tyQGR`E#l>!bi3u$0uy_Q#&dJibQPIDMV=V72u0b9Lv3ZFl3&@#leI*GajOCHK zC*I+>v};$c0%eAas`2BSMmWsaX>Am?o}>TJ${CY2FtNJS3EKYUc_r}k ziJsm_9*~<=y9=P&_jrA@;auQyU6*SOT~MK>112h>&05ZmQs0LsrMPg-Q41}mkz z0g2C`kUr4xIHT~YfxoNLPj-CF;ZxA{^t*NXaKP`GlXK#Gm1hAS(ET;oe-Jwj-F z;&5018ea%zq(?Ru8fdV*aUvwuaMBLdcyw7|mIfB-pVjM+NMHj_zaJJIT``R{)|;bE zyJ|wP2=${3^j)PIM12Z5YPspAhOq;mmdy3KmXSPah|wK1Uh4Z?tM1;gP=UOE`%Mc$ zJdM)Jfjhl7LDMvLXTSJTuGt>DFWDu!FXBNuK=$6g0k|V^n0~c8y*N%>cY&7!BXSb+ z7c}WFdU0>^fpu;2H3=(XSQUKw;-0l)FK+KKGd4F`!1QPcw~K=ph{0sJ^y{yA!|O{n zq*_UOSvK-~cMcfD9l3$+U=4VcR7x`X=Yz-~Cd0bG zi8BL-cg_pITF1N@C_?fPmt@dzjC`v~a9H~Xv3T61v!RB36FX_gmY+P-;gW;=YPzJ3 zJiHTm*M3ywO_xMMyZ;39MK{w9zwZ?{l zrPTTMx7;4@aA|VtgTlw7x9)L4<*LDOZ+a7X$f>nVh!8A2xNtv+5ifV`9#8Fm7^^D` z6bmMD@$|9~NMg08gN@G9AX{=EXZ4|EBxxsnV7N+-?6P(F{Ae4%9?w=;(L%Z_O$CP2 z&gpAlK4znp9cJ37v@%w*8w5qEit|*QBk#X5q0U*xYqZpHSh~4Gqc}xoaHqqXJIH8TlOy9Z)_ESe@-+5<>~i`4ub`f6b4Me zwID6ocg=9GAUD)>m4;eNqtjU0J9wpi6oswexhMr}be091LPmC(6GPeOZxtE#0F>)M zrF%9V<*9R=v>+_Pr;V=M5>x=g^v@w@*92f!ziTww=e}Sd`Sqc??xbJfTu2gh|Nkks zb&lOQjZ?IGVvx+O5$^{H+bFz;1De1HitD$hK(5U#UR8zNdJfT0RVQ`# zij2qs$z)(Y+REW)n;Sj{^y`ga>i1rBb^i$tJQKIMnR7%w)3x7~wYDpyWQ$&&);ov( z(dyr=G5Dsc`(_K1cCs%^no=E}mhwrk%pQi@%lw55?DCI$YG!be)AbWVolw;6n54w4 z+FY<+f4ZhC%@0>T`NrRrUNSN0juLNvlS50e+UAl~jC`eQ5Z~~+r5$AUz6tqvD-AVk zAUA|JGMc{3W-?$e{|WV<_%CRv)LagYl~&+l{7;>6^It`=LACArc10$>=vwh&5tvNK zFAVO6{1I5;*?@GX%x#E#^>Z5`WHG>yW=4GJDLi-4*pdih8WR+4tGKu_1(eAPpv_#q z2a5X#K)^4CoyLVnyew%(Qwn*<4$uDX@9kMPP52NR%A-&2apb_>^}=`edWJGgq=hijC%9OZ|{k<1;2fyh&yK)zyN4LK;x56qxSR(3*6qZyxY*@gj|)ikJT|1yZz_i;wB{< zG-*xM5>~mrAi?1Q_IJ2$u6VrqS3cOGF$w3n{6wD%3$0&yk%MN$uLT`N0U)w-zd9{; z!EXOnzy3;KME4AM!55mPK@}26(xaWPITUm9?!W%{B$}$`Sa^m!RebxT`5d>G@{LI1 z0t>u+%FFMoyH<95K1~b`Q!uT5!c)Z9yRSQvjyB*JZf_e&ta@$;qIeb_Ga})_^&%V_ z)x~{TKU#l-0iE$t>sX)u`=Miz2gs8@AXB^HMuWH2at}8Kxvpsl>Tnbmp8f9bu1-q` zFkULwWKBGSRr6dOK26#&yzoQf_58#cCgh3TGf5zvFVMDVuwpJPbGBOq;FCMXX#<~Y zq9-)o`yH^>Ya)QrhzzfP<}_yHNH z<@fLS#r6Ec;~Ab>xHv0b@E5LX1YEG3xbyiK*XxdII?5CNSK`Y^PDdck9Hk_iQFx0duH66>splfGUf8ar`9 z{d43e5nxR@cex2?kb9v5pBP^9_?uM#}Bhfa{L^584^YtpPhr^wcRrtzZRgZ7N6+&({Nre9z&! z9!nkx=({}SpYOl+p9|Gm5Jk1lE)-xaGRnOrTq_GyE~3f+BmjxnyO$(IYm*tM*VCUe z5RUrOBSpO*>0xi-4o$Gwn^@bC4h~9b5tql=7NZDFLA+!yRbF0b{cDt_>l0eNriGlR zSFG-`gM{1i%{ECep7A|`i=%lgNGDEq;Z0D0%F|Cy`QsT8yTst1d#BvnipRp>PbliL z#vAYiMnFFLt9KWTUq3$30`T<3+NrwQq_$c-f|Yy}!>>0JRa>^wu`}r`5^3_}3X=}a z!{guBsv|j1MV{bczWA>BX(UehunrR)n)K}vk-Au2SD05@yOaF$)z4S;tLq!IuU@Sb z6#q4$3J%T&ey>sn_TZGF z#A=V(QqkjzPx^Cp=cLH{GSxQ(J5W@u_03mj`>O=%IA350Wwh9kg1-|^C!hm;jQ2p; z9K);p`(7yiT?U{`N#_eCSCx5It7R_L|8~@&#s0Na#z|YLU*LzAr-sjfv3P&uO-3Xu zU?vbK!&Qz>Cq?3<*W7>Qwa=A(7Zk^7IGgMOnM1XP_;`EOi8r%le0*!H16&l`RbujF zWM=x5FZh zoe$hAleC2QVhMVgt6&ty;gJ>2u82e=?rLg%;)7iiPUAEzt!D2vXzU)G%%H90x{<(> z)8#TC(bKM#LD?PhtClFj6&L*%xJ z$?-xn-4i;}T3aqJqZU=U1Ia5CN0xfO^b$_7qj_Ns_ZZq zJnH(J!14Rh8wFosQKAsoXfVLv#E=r)@&);eOo*bDx>n~AaH3w$1_%nL*6C&#R5qoq zSgz;9p?Sr@Dm?*MNzhCFKE=VKzni$Dadw8$rf4U)3=A%4=1Vf~`P>RaENGPFYU6CV>w4)Mme?KT^iL|GPfseM$Q$i-DXt}Ue{^ZNN>2C zcGZLwTmW$M<;V9ko|&Z|5l43EWhK(kSgG6B0qpbT7c^zTpm`ta?QcgTT1#q<)?hl@ z9*EnMrbWb`alk?c9lX%Nz0x$NG*Y(&aA2XnF<6=s$6jCkqsb>NGtFpqwsZ6SuPvfuBIYNs1$Lm%hySPSi5vfEeOZCjZ)OOi9%d5OO{&M?M_1}-G!x^nTFhC zyE=PyZ#EMSJm^a!{&`cPN#Bt#HS6uf&d_u+;r7`vn=ss0^dYe&JLy z2ry5Q#J@Y1Lr?`i6Bb!0LiHQcebF;8@Naw7Y*ad$T4`M!%80l$h2Mxg1iKv{9lA1H z5rFp0G6uEKcP2z#{SGt2$o_tt=GdR?+}+4Me1q>Sl#=sZ17fXElY7PpzZr871E-oc{Ne2;=l`Dg9y7H+&A{pJ z?p)?SXG|kNh}e7A{a+*(Nf>x8a%af9iykg>`whh;9%Qx@D}9o zmnbSCOYJ9F5&vpE7KEP@=4HH=b?!!yr73vBGpZW3=sX0fF3`fuhM!wBGGFXvihW}y zR1lL@&F4zYLY6{daFhu{fx6_CPRxTVf!L?Cc`}Rj_9o_(!b`8N+EN!WRPdm+fVtXCNd@E9AK9l*GxHRjawdu1nj7aUJmHH) z^63M}>1P!%GnJg&OM~hvgPZjtoJS5k|xiu46I~>a* z=Mq7m>Ppu|+NqQ1jPj9cc3JjrJmSYECawOVDm^K0Fe+dmio7(Lq8gIPuCcG6Qc6mG zBN=?tg-5aTY8>_EuNSLCD^s2?D2mQ1myzRTT#!kNjr^ zMvBfLv*UYzvWt>yfMP2Lc=BZM200RKUeeI$@3?Zaot9dTuO>Rh&xTEaF{$X)9wzy z-Ti<()JQ01lmBzhAPT@Qo@mLjj+>$&E&0pa`=)=*RQ45ig=UOR$YDJqP>UP6gfymi zoYLfEVWoO|(F?cNQGFCW*rL-pQf-biFp8g~sf5#x<7)+mXXsIj3VNU7ykW_`$RjPp(#}?GHPwrZT*)V-9MdKwb zDf6(%U2;p1$`lSWJ&LM4?HMFc>Y@{pUK*c`LT>gpklvD#b9FNokHA`oBAHVf z^M|dLznUP!BLqiMOVXPX;7n)r+8PG(pZ-mJ59Zkr35Gn)QE+6gRJ z*A)aU)1x1esy(>9rH^l#A+z5M`0~xa8(`LPg#l@STA+aY_a7+YX4pXtrZop5 z`I;Vx+v>&)Zx8;CNvEaio=~~~=#2ISjFdAe8@RouLB^=}+l!@&xHn^8_OFmx0JNqpGic@$7gWf(jeK{=c9r6#q#f-KHcUJ(^|w)QxT3=BXG+pFTZ1v5 z&qpDXhex4-ZAFlp({{oK8EQFsyky*8?i(q2=PHhTfqX%me1Vw@wkTjth(?}ANX$p> z+=x-ab*oLRvA_o(P}n2GLq2L3AmhL zk+Jk7ROlUbO~9S(@;8bH6i08;_HF(CRDAb)s04*4)LmghmPUp{iM0@a`B$i&m7M1{A&%>1k5eKa|0Jrm(7_@b&$-ClX^P@%pr0x6 zW+Eo1-w^U#Oh|kGW#p~G#!&flP8fVL`?unth!5B`w~(0jn0o)W3AFSNaMa_eQc)o~ zd%v4)?=NU*x|BPofV|jVIbq8)(&w|m6W{qpL%q`f^7rUW!;9spxVL0R3fEfwvt|@F zjjm*J`lGq?ZN)}D!bRQAe-R$ zkI+*f?W|6Svd@T=<1`RDI3pRFVS>BYlHP(_S`hwFuC%w8a!u`PRBOA2UzG{F3By4~ z`EsPkMV5o`Qz&9`MnwZ1e#dT-7yh|G!vPMW{^mjz6yEr*tt2@&#!Iv7_-8f$*zHc6 z1{n|X{ZFUES=96~g)<-#xjVA((I@6g9$a^HP#M0w=_`>>@w*ebM`B>`@4CrHob4T9 z@HWroJ2SX?eSH}hJqA*gHdV}Vo<}h>PX3cBYxh)zNakI`QI(fz5tmcEVYGPhw?7!* z?Z8Le(7L-_Ktsg;8Z&NaE3Izew$HskNGZ5Sy1jlXeXn{}!yWLsh$zpK)*>PZ4?h9{ zUM6|qW%tqF;G&4S`QpK0+D2&#bETssnI-<(88VbJ#~f0$KvP~^d6f4jPvz(}Ef6!Q zLq{6pCv#Vtl#s0G&@P@oqC=(Q>+g=!R?4p0p{ORY%fG7be zd;ETtSan`mHWR{xyujJ|&DQ_2`?X5^-??=RK2W{FQ7z+a_J;;evoHE(cenh?22Mlj z;4P=Jc3R&VC}v9ODJi(W^~4L@-cGCp!%{5aidplb7{|6jJZkPzoT6VW{f}IEB}}k_%N{hw5o9OFr23RD5hZl;`aa30sv)9;@HeV zCsQN_DbhOr?x2#lmGglQj*}faNE=9?)6xrE*#|&3T->uI9H!JX#Kl8+3yv6gfOcfl zr4rXbp#+^S(Gitc_9;sp@D+lH9UJ zW8om{LC=EPJ`Dtodjn6+o2QAsNmEjY_THzX(4Z^ZaA~TOBOLE*SUojGvP}j6R@J@REI|CIxZKW!um(PGJootNS5a=9=aBajac6fhrTK4JwZi#B z@Fy$bb~?ldy{tq&3%fmC0J(@o)?}B?KjH4|$L>1dlpzT(V(^tc6$edj**z8#DAH0c z@t^r48uj{hWbsnNgv=V_{l7IfpOycuq*Srzi33{#@otrq%qyD- zTq_S2#tBSv;hn#-f}j1K3VA=Cmhu$TZn)#%8rF1q{%gyTmHi_I9;H`uPx0Eckq6LM z@161LrfIi7>0{T0)I%S}Nhf_!W~c^zgUSs1C>+S zmlEYF)%9_<$7G?BX@8wN2hlZkp(qe<&mEIPbu}Q>Mz{FNbAtt+A4dQU!i&-sqlc3a zx1+Ve;c55|rgUaUHjF=)Cz<<$uN;cH`F*C5{fidJO%;|5$Qb&{GNfRCcA5uteGh=^ zFcXYNRF$2SqLzrso*`iR`R*S;=|1a^Ug5eo9mM z+43ciID&1nj@pW7`*#^y=bj|EN*lqe{Csb1H!d>5thQT1I|m`kabkU5Ah(W{5%KOB z^LoW?ws(OXKXGOhMmGd}XnJwR>grSQSdvy_R3Q@-qci#DqL>G_P+2F4g(-<+Or8O< zbtyGo|HBwKzllu-)RL#fC&XoJfH=8uD_v2*@!t%nuI3W4JM|hZj-$)9=e5dv!}H`Y zTXfc6xtPxpClc?x+~&qLRG$gJHQaW6zSK?awnV3R&6`FfawwD2mpS2(Zuk)sp!iuH zA8MAf!*$D46%lvRR76TvS9>O%|D>lMU-qW-r8Y{B{*;E2I_z9KMHwhfuM*0Sov%mX zZ~2EY;`eL5p({^sJScN0?Nk&3_YIe$(sRLxNtKh?-=?l}arV9aMGI-Q(-7PmDm#FT zQAI(Je#TFyyAVpQ98K4~N(`x@%!&{q1K24wPFY;$MsLEP+$(MK#8 z-Vf;s@_QoJi#!3n1w83_zhWXAVhA54_y|CYjYe0=D~SyT0c`7^Pdjs7w-}(XlJ7Uk zFx1)P-)+*e=Rj1BL*;lS_sz5~(tq}gf}dg-;REFw1u4e!4`~oirI++4?1BsV1w)K% z#a_8{xTlCLn3DHBBXOaW8G`RCC%Oq*Lj1eb)dh7-2s5I&vG-Exx znHTInH>x%?n~g}ZAi_R;##4QUo2is@QC-(*utHjYAC~qQ!QZCWuQiPaEZv(QCTW!d z#;vyx8{3A}TU!)m*p$q`?|w2|O*$ipJm+_f78_S$nDLDp-ah9afRjEEV7S!1i_WmD`molrgLe#>Mi`D?02-=hYnt^6y^>SWMSg6s>cZEIJP zZWQ*a&%@gvgxSPVH&!?QSg-&f8KL=C-9!F_%S~A;v75Y7=fBw>`}zmfd$zlYC4krA z@V(X1rp4rOPsXd8qoGa1GC#_dhC4G_?r}04e0%%Le6TbmIqK;%Ze0wmNXF+km1<}RU;TElyH(;UNvL_#7{z9l z4^z8kwDb*A%}y1Gw|Q|_(eCecjdkxn%6{S8(a37U5jXJz?%L@29#Cs{Zj>sW%-v19 zEaO6GJ4iR+*kL_L&-%olQewQ#Sn)jY+~v<>*9$|=S}X4QZ`Y4VbGp^;teF{J{Kk9N znrp75=uP?ZNRgncXZ~>53H{C`jqPCBLfyvrA9_ks=Yx0#6MxKPv@h^C-*J;oa!;Q1 zjg{d^egVh+SxBh_!4^OD+6=`V6HMN46mHV_Mu_2=)KRh^W#y*`Qw zy5_6H-7-E8`_D;oSt3-M*N_0do|iL7P^U^!i?E36C-VjaAom zS~nfuDEVSfO`ne2cBRP~qm9jZEt+jb)9<|-tpcBnLWHUzVrS9vn%lsFWp|q4Rl%y` z9)31w4gWI!WzP!CS?;~8PU{V+;*aa2v&k~SrCV>Ed*&0vE*|veGWR-WuzI2bZf@@chljye9b8`? zq_@gWf4P&+W*3Un$kf#9vAZ_&>Rv|yEbwd9b;xVpQ_aCTY{PbBz^qViF*EFdOgEiz zc1+hwbpjk@o`aMuw=e4NXIctY{!FjOp!dO>;IdxXn5*}4)wXRs%DF`=3IC*T`qy$> zk^1@NW9c8Nv73A6S3CFPJ=?O@o||R5TUSg!=$8vII@UDuzn5s_xn_BoM1ka&Pg>7= zw@MmWP}E#q*9y&!7pw+XOfT%NcaNPtDBigDocFrVy62Dr{{5ppC&N#^a(&`a$Tw`;51$QSWGE4iv9QYdg|G!vW zZc8KW!wo+KgN^%+#D#lU&;M0PZEQ|$jpyI>H!l!*t7-QRgh9~+1*jEkH$c~qbW57A z%a2?9xjnM*lA5AG+U#VtoU3vNV~g_5jy!|T_%Md=Q@DKvsk#+@2)t}HrS*-2gBq$K`#E)$ni6;|mqixo*kpv~ zPsq}k22rfyWc8wZm0eNm$oX1`6V@QQ={@^$pU)5$I@V~+8b>dy*=^bwC{KA(3T-nu ze5b#E^Cl0=U`D@+nK09b=7PJASrIk!H|*lkThLK}1-UWvI28rIrYA$9B z**R+lJhwc$OsgfP4H2?q=34hc3ZDH#WlfbC41{;>NAgc!%v#&aFk`H6RWI6(WqMgf z@9GQ3ZOKfHiVb)27p!O6Kc1A*TJ^jzr{-<(BXY4LPKdCb1Df_%znneI=fljm=l|Al zC3;uIiPd&g_gVh@VK8}NE~V-HE2}`$?faP1$DVhMJx=SWzGYbMzU2jI3e=m})+}&r zb78#=pY?SrMT(P5Zs6T5ZlRDtaYqhB`0FwHCH`ur)X=xh8Bp&6F<6}z5xIC1Of%n5 z7cM!6#`HG3)G$&W^F$%}G{tX-JK=>KcoB1WPtBGyniUZ~!HPcwL`c-vGYsR`Urru^ zx3@0Qk;7t96ocp%dWw#LG}eZ!7@mOxek|ooyDT8*J_@^yXaL5#(%9wcvH_n>NrJodd1NN!G!s(FZ5d@P6m8Xb z?3Q7bG9Xk~8ww^6lY@UqgQo8|Z1jl{&VS$B!vg>98Ep@W9i+u-)I=OhJbAIlowe4U zZT!-dspm#L8n60N6@?d%Vamf9EDwy*n~UN0e$F(Eh3?Vg40vkC`N!LZkHQw00kYKq zg@22RI|6Id^f_e8=DzLmCr{Z7=jM~tej_V^J;_Wdgbmrz)E&Qf)WfneFQ+bfE;z_PS1$fT{YP5tLqW)>P?#f5 zV(8wuE-Yc!%6LSL_kj_!cu5#NC6Emls?UgUDG7cFiqC2K+my&C%94`Uh10lknF-dK zSLZBGIhNQq)*fzF30=P$fpeuWU1vV6`njUOvRVQ`=;>Y4*a}UY5Bu0ZC zbDIH;{oh>oA`bH{OHi=#vLHFLoKcxvtQ8V9p>=ij*pkqdt)0X0^t?{t`{o#Wd;trq zZ}n(}T$u6^0(qXt_aPd|kePJl>t~EC7_~UAVYFYqM&x@|6lGIeOhf%{4>DxTR}X_; zT;EOEA-wDLTt7i2zSIjPSy>0_ESbLjKc5)UgqtX=d-Ap0zhWK9`-_3&w)ySJqn9rn zh3UyOA|7PB{Q@*qa@zb@>*lsuNA8$>|4Yhz%Bc=|xlZmre{nY`Jban6U|p-BNuXKipm%3!?QMOpB+$+%9YSz0+bKc|S=Zv;XgY zte&(V~e-Xi_(+yq8SP{E6i&S~@W3<&Q&3NI-h%!IH& zb@W_XG?iv!=D5j-l<=?bX;TXfPpgWiY`i3;4C6w3AzvZA|C`}{BZ8sXTv^&w;lL5j z@y{r#c+5xHeUOjx4NzRg>iXuRr+`QcaVm98X(;*qs zvS@0^dg0t^M||oD`(lU~yu2?zyG9klRM};kOz`_M;*$ljgkO}%9ort+^xWdQgV&(j zw8+lOlVCzLY48j;Xc>FnnQZrP=J%|`Gr`|Nh&Er!8))zkIBBSBFIW(t{vKLtD$B`) zsg&|6@or{9AdqB4k#Nhqkz*^i*~~~5>k!?)Nf$VfPJ=;0g4wAI(T*4~6xgm-+#*Yq z#Pu>`gnKg-0CU?yG?=JY5xh)&8zG&;QPhE`f*HJF#@~TA! z_zm}XG11DWxj~1XqCkkJc`{Gh2{{UDtL4_wVk@I_4tD6_{A9oU;N%W;rCHNb4-Ruk zcIu_2UfC7C7Bs$(&HrZekuxC8>Qyz)Q)%nJjZ?N59h7$o9OK!+z1MJ+@60)nI>Uft z3}>!SeC)hG22Nz3fQYZMFX$=x5|Gw=6t$@AJ2Ne^kziZlcpL-R1uyTOrNQ&%1z)jE z@$jZUkWucFQ2TsS_vs(-4`WaJneZXmi~T$rxuMl_AlP+g*F$%i9$HmCyWg#qqj=(; zP2m>UOZItff4W&j9FyuPw*aZDNB4@~o}xpL7{v`EnHi{!9;SCW%IU{Jne!yXU&^rX zq@j$?u|VMx=d>SkL*<6!yL8BI$j)+PvKLVp8mGk~tn^CNxV_$!bpi_@>?fu>ecnTj z^nd#puzWnj0+}3}G<9dAQ{0GtB0zn++p_kNauKMM-lrGvcvHZ~#jF0&QqH=b#62>5 z5@b^R`5phO&Q&~74+Fb-xbeoXZSps+mY}IF`IGOr^nX;E`%&jT)6(8$kdp1+U*J<@ zHDr0OrkYBQv$MZqrRMzyjF6u@ln{d-wqHJQJ-i_df!O6Od54lAd4RojZAMpqjSL=4 z=dQ7vYB!#LuwU>yW4^>_#yHMNC;bb#Z~59p*A^Q z5UM6j`6Oy7i6cU1;TJ|ddh^aq$Tt)=F7Ds<>6z2N#mKd_k0a8_x+UF&1v;*f(-nO$ zl%u=L(D=9cv@dhxbJq%}I1SH5*|a?C9X2A#hs1a4m?U{h_`^xKaX)CM>H%qIHp+eG zWkR;nMGPEW#Eb&tCtjYnLWSZ=pQ3y9aScW>&Vr^SKEn~=yS%CDY0LGzN6GWrXQn{g z+C+oRh_}Esw2G~q!x@R;H26~MFUM?5$4~3)^N-a5WtZ=3*3AsVt7O5h@ykjn!7}%s z2Xe#t(+u2T(RMFfWa30>n5ssm;^M*=2K;rLxI8rOh9c$#(@}n)2$QcmjcM^?XGPdt zz;dm28vJA#ftyhE-*=pu5pga{6NnQBLQAA|>@jXK#5|D=F*WexWkd$d$oJ1Vcvuy_ z*0Xts!!#)Y?T%=V?#|cG#GNd@@mEb@;vepV)u}!P`~3(UU92HyDxJ5MkC$hY^>ce5 z{lGbFdB{^&6U7c%{9n@0dQVLj81M5naFN6C&F0gz)X^UP*RJmcF3g9Y(=vRVUTRE)9JpS4_$C#iq42r$ND$jV4U5Rxc|4{`2I4YPjIV zaWLEV2nNcUJkOS+5G!S4F8}Bx1MCn6s4Ug?4ZH+0H}n5pJS?n;<=m{&VJPBFvL8Bh z>M*PX`xfjmAz%9dpiu!~yA$gSDuwewk1r~d?JWFT4?z)u_&nTX(B2Ej-ZU={VEAah z{$(+HVltkTY&5_QYk$g^`n!4*dw=!J#t~pZ#rG&|Sb4hV{n8LNuM`4$^fgS{#r0c2 zdz&hFEpq)ja$T0G+`EMZYyktT9_U3Hccfw7O2i?G4N!`jvbP+fDE=pv3H zN1;h16Bsz*^fSKEHY5bFe4K_wJlz_A(|hSFxPh>nb{gru0?Dp~G>`GFG8FDk)~47{ z&0L)^i+m^ps{Vu?VUq!lRh6zf3GB@QJS_QG$f`Ze?a3i(jszM{KjsJtL#!AWMKTc> zp)OObN_8_m+CoPq%u4P*f+(iEEGK8{3_2!OOjnu|D0dp!6LNKC=pYtKI443W)70&l z#m<2VIB8>`|Ji9jEUlA%%efZp=M;?9xEK)t%&pTlYbaqeMAjG1!jM`|Rdp3V$14$E z;zLExS8uyJ52Irm`B14+Y`c=s7@HKY$n3ILYRV5J;6%i)$r|%hSe2qVpg_-3u=R+= zl@Bvi)k6onqAFllc<(-~CImtFLZ37@tQ`1QCD<+CVG{&odFW-#-m}@8!Sg=I)digi zo|E|Xz1h#h^P?j9`kB)h=u#ZMPq$=k@EgW{&wE{aU0^0sDXe&SrSi{MvayIt{|6UtnVXr5qGbKJ*)RbIk+W?jBDF#nZYup=?_` z4LHD$D|9u4^#5)QSwDTEc8-mci=nvicd=s?giFP%vw-1+OBRL}!QkGpOr9V2kPW!& zn6mr(wS83&BTw3!`(>!unmreeU$&jO1M{lbY$DpPfAXNd_cCk<(5#K;a%PcCs##z= zu5;q0g<2qAgRzZAgL&i-_eN`wm|f-h{7~g1UH;?lXS92-KafH*q)hQ8jo%+~Lt~gE zCiT0Ca2tB*a3!Bb*^W++`tozZiDn+x1QTnLkjmiGuK0b=R$Ct5YCQ@33j52f3=Fmrb@B}bdPIPw>3QHVNCs%93K>FJc}VIF z1gA|!fM;;j{&&r&=?AS`(-34#rCHGD9uhLt8Hr5!N+g68q<|vGUJ@Wh`1kwj!Q233 zKj+W`fiV{C8cxl7koLgmpdrf`v;sR%Nt3GZpQmtrD6%C@LC^|SVAP!0 zAK)>jwE)DAEZ|=Jg4I|Npv@LeV2zxr*RyKdmW6i8JMope%Vq2Ua^DaizyG=KLVC8$ zes=2?&+%>&8)7Qi;wJ%Y{`d{BY_fR4%MFcxtY}yb)TaBk%!2UM0p)4yjtK;{PM41Z zwzN9ZoFE-|xv`3Z+WZZX<}Vc>XvwY$#D+gS{AnxHgf?UaL30fuUlnkR0vdnf0u(u6 zeE+@f*O5%NOz;zXzc=P~KB|gUBf#%SDw~>CP~Ga;iVsB5gb-F;_I5e6t7d+v;T^C9Ps{@>7Q73zT?ZVhsMfhk6Jh+nJgwCZUxCOIM zy*tcaN-n%L1ZcrBR%txHgD9qv`|w8MrkCp2|CSJ7o{SUk+wXiq=VLM`>VaWWgo^ug z6&P=gB9-MC7c6_V)WW0)9WsnMp@|~4V!Gfr024U!g&@drMFi14UQ++xQQpb4Uv`Pc z3`eAh0^!Ln9fu{t2*5Ht?ZVDVf4GZ_-mnT_c}}bbPf~>1kfQW?k z0z~d)K^#8H6FD#PBcLDkDiaaf$>n{r?33=W(Yd04nuZ+F`Gb=cze#q^?k$s@5Ifm6nw#4@Vtl9e=Oi}R^iuPVu54<*_C(= z5zFZk=jls;DkMxWgs<8UoUkIg?2IpCTZNaPR5Un}^+3&`aRb%E0)}=b-FVRqASfsR zAUdVqk9@soRRE+e`dH$Jt{7l; zi?fCY7gM)-74Xs0j*m#B2Yy5X6&Ym9y93OauIL7~?njXGHncL4{(qAra#Tbz{pjM~ zDc8Z3|7rnN+K>B5{EU~>ffD5M^akRWV%}LW*}7u6c3rQ1RB)HS4?J8mcJ8<=F;F6M zx}pNeBEuX#0|-#?+T1U)1T7Jh_eZ?7sOAKg&V0n!KcUp|&v z1{KtrU*QSS>5geE5>NIg8xKGmLFIXIC4CP}OOk@d=ytN}Au3OTM!#*eVD<_LP}R7H zvrp7NFnysMG-1^@0CH!scGmr&=k5tiP|qSrI~4e*%@E^ZZ;$~9X@>vDga(;^DjOaj zjC-7wk__P^kVG~bg&?)Yk#t_oOn(XvzP>@;y*-roN}6vq7}#^kPM`UN6Dp67refHX zQp^Q@pQv5#|3Wot@VHU_$+6It8Sk<9BYqt?5uY)D;TVe31~_Zx4YpqVA;BX=#|l8> zjZk@6MqEEM#Bd}pL%kp-<6a=Y{^e_vMpd?_f6HgfPUS^vJi)l~rjxH7i#xpWmD-jD zkSfZAFa2JM4S5zn=Zx3z=NL@Ta50|qQuj**CB8KECcO-hUh0bd>A5NB*5=NHnNo&W zIsYNMf&O<3I3q!IGS$7D?I!=^J26L&SjX!H3S}p8YYVB!1(eVvu~W3)CPbB0||ZDkq;paHLdp#5IyBV3r)D%-U&G zFJ2Gy?}TzgF|=vF(sU_+xr0=Z0T+&BnCFY~R_`Gf3@QhZ-UF~WlfT=$RZ^#*!WA5poOEW9u6N!l3^M(AfHaNkpQs@tL=uyabfB} z+SX|Kg%IX7NaqTda(xZXNJ0dD+#z(POxeMbmJm)t+$;dU#z{FqL;cZ3S?Gl z!DUC-CsND#1`S3W?8@E+bZQRt$zg6UdS(IvggO558mjPk(i3=<1*E#a(D}F8c!rP8 zcc3RBE(}A0E+AcZJ5WMWd;FoI)7Cs`v&vRvBSYyJgEz$uRHaaTEGfb!%bYiX-)&WW zx}Tr1LA_+6n>)Vm+oJHC=lvU~Y&<{xRWL&<5x_=;CjfQYkAJ^S4i1Em-q-PNv%rhZ zrRQ<{KJSu928KFzTC~lDz?J%Qqeor0rPLkRriW(g$_w#PjE4~20sGLOG((Zu?4Cg- zPwsd^{uc1{c)UU0?GRM801`y8;8Cau!4o>JjyxBoJUW@a zV3j+UTu=>46v!MJSv@)0X{Tm6IBdW<{^t1kGl$-fG=&tXGhWJnP+aY=KplGLE;Qe{ zla~Ni{SpXP^B=1!1mdD1(jrgzNf63Lif?1C)*@&Oxwp31_Cp_dCyn@%g7BLCA zyrek}w%Vh zNIxuD9?bg+ZTXSc!RFFh7IwK=WU!au`%r#bmjx4UosmLKnu3Hc55!kM@6X z?afN}7{)Z;=zRtxfqeF?@egsoOM&64ZLC&%m{R|SS>O(DcMB^|1m$`J`)^? zCIWIT+=f^tS^4m7xv2tTbQ#@4vK+sSLn~RSJwiSFSUfPN=&SvYxR^>BThlMqz6`#F72T)?n5_o;@X68ZhQNLK zgGwgVj>D29bX1b#-*`bqo%Ge@IDE!4_AuS--fn&BML{v1bsP+D%+>^YR_M>5@5=}2 z+kyBG@Qp6RcCC%Wpj4=V071GrfXx2|^crf9)nz9lTef{|0N+TZG*<>oDxAN#@b@A0 zh7@F*nQ25da9_UWWOYMaAQq$?uM3mGaMroZEV9{NAmRN8HWbqxGX0sX!18b+bZwk} zFBu6?pRV4Bk^>3j>CAj#Vuqo$!^Mw#?a0AF>JJl#gOK|-3j(49C!u;QhzXcV1)R7fA5ZbUK$o%*^ zhqU*d6@ZHHo6c36XUpLfhsNUV@#lAA{OB^jbxq@rYdhMPG63nDTlK?jUy*-B@4Ld# z%itf5Q+eY6Zx0xYLf~QZOWf%wy}d|XrJOH-(N!FNBB>vt2l*fPaexim#@ z5D*G7y@&Hem5;v6o@r$dV>z{@-njRwrp{Z`HEp!jj%)zo&ohYCQ=$6XIcGrS|*piU|Dn+_N8x`{Z}Ps4o>Fh7n=Y*?qNKuQ!tm8Ay!5C?I5^JjDVg~@Reir*|q z4G7oe{p?QYG0y052r}PW9v3zoN|XNdWR?~1F@FTZabWbX=722Drf@?)RcDD_YM_E* zgp8#Tjr``n{w`(L6+bxYlJUQVEzq6O{gAfA!7>aS0rDci`S4kfA;q;A)hMRlf}qtJ zKtX?^f&m2>L4)|jM+%j$f7v|?T~ic-)}=Bl-^JIgEO)sTrRLQ4%{HSn!!uGb7=uFg zwB#DO`QGvVldw0h?1UQHXO#b?8EGz9PX4WVHa(|lY={&@_5o`5mgEyg%gZ}8touxe zuAlHMWEs$9o(nTZ20wmN7IY+0<3Tw5W+7aPdMzGgjyI- zpO0(hD)1y-hpYm3Dw-gb^EOj~Ds=_h{OJoiU@v6?di@s?U}OfI$dJOW?YJ1UY~cOM z-HLM5TZXWD0r2E`*r(NF0z?pY34w#1-D-(FL${ZJnaw+U!ijIb5$l7Kj|kO6aRDU0 z4*`&g6}KN|d2`|*hST7z_b3;9kN+edUO8p|+h)M99?TjKgs7wQuOrx5Xbh@iOea8Q z=ylJDUVtD<4zysfh9S=UO~)Mq2w_T=#@`Qp0|Ft!J7&YKjvv7GQe72G=ALl|Y2Ug@ z2wOR#zGNb(ccDgf6QiR**a^EmGQjtXyTI6xi*m&ayapozkSCeIN#dPp0aG~Vr4aG6 z^&a4=DH-gU`jI3;Wms?(j)d=Z$ssk3yKR` z-r-4xMF0<7)@nw#>JI(}LIUyIAljy&#>13>S-f7MhBLw6a8MOx=_Zi#l|81^$(-10 zsIPxkLWW9pYLOwU(`rwwSG2rOxAg(-8;rNk2Ri7~z_dDvpf-c!a3iJwV3HyCuxR4l ztNS2$m;3;3BqvJBfKXW?K(DmRYKNF2;$~((BRVzkP>V5mUj%C*DAvgAb5?-V7;R$JcKj7`nAJX~2z7cfK>mYnGg8hoLy6s|e-2+#SxKE4 zbe@fX!vWj6wQM`!u$LFCN-_8yA~lv5e-lwP*PnM(6?&i4IR3)Fr!-~@#7Ez^mcAq1V#<8So*ER=twB* zMYCtWW=pVYyHTReP#iTG0|Hr3#Gxn}Wp2c~3*hQ@AXzE&*1dkUMFM80Fo+6>?5{|H zZ}#wT)9Aca7u>;I*&7oyil90 z#>81}VIhq1lGKdst-9zZRZ%A+Sdp#ytPhEC7^ig7$d;|LGuCq0qYoY)ffT64^Y){P zE$`!V?|U_y6_nsN%NdkBu|N;?G5b(U;-pVNcw?HFLZhi7{evJ;FiA16Z+8%ubqv8nHx$`f`mqMmiY);orwk ze6FCvf6qaYDD&vNCSd*)>j^;ZHXVHrTUImZhAVuWXdz#9p_^wSLdEYZkTuP5yPd0aL9zE^Ct${L#T zS3R2Bi+>h8 zEbrbR3)s2yO2KJag+!#;lX{lA0%^MP(CqDZ%Y(iIE8mFy-1g(BqO#A~cx69bi97ba zqE33{0~$g)K>_v`BoH)+*SS0RR3b!Bz3bRCn-of(2?!VaVFt*S7EZ0Puj}HUBjP|0$p(JZG$XWg z&s`SJ4-X8W22bdU>RJVBnt56(;Hd`^vUhu+G0VK#LPo`^`S`s(yhERQl<^~IV*MWf zI`R38FZwOe;~{ye1i?=lwuk~(V@-6@2U@MnER_z&c!AIaNWhs{3crb9$F(oj;g9;c z@*otBH-6&5{Abg{Zl(c!53~oIA$&D?#|v#D&pE`W^_#3aI45)#SUxC4Oh(+l2oqj< z_LB@wFYE<4O~-ScdFmZm=>EAVP1MPl%MH1;{QnWMtDqUwbbt2h^osYFh&+j{@cu4Q#n+(7>~;H|#$b?*7Qp8V4)=jiLqP=%z~v-Ax|_?BfLXJ|hX=xZbg$5Th-h=9nh+sc_d3D}%>3Q?@q`#w)O1 znfSvAJZH~%_A=bU+MMNq`UKlVaJPXU>iN--Xs1M?%vZ4hDHA46jC5?&!1#>a8r$vKd$ z6Ep~J0vPE-Q0R&;z9I%4(|;LC9WC!`T0~#)W<_ONxdOikwE}bk1Ka`JVU>jE8CYVj zA=Y_~>Z4lJVVE~~*xMedPh0c>fS|7Mjt(~bj0Cq~gpETC|NGQn&NUPb$U$rfU@Hqw zyy@A8x>r^DG>MRE@Xy0Nq&1KQjL{;t2>v};XrOAAdeV^dA74ihxDC0JfH18pA$bfl zgwL1Z`LW~ro|1q8NkBw26lTb~&}!RCbENMBPP zd7(4uS#)r=w-KgCbM?qR5|pCR+LKQ9&U9SZ%CnX~)wD{xsyp;}4d8H-LeK)TI^WEt zkpH1Ga2ik(p@p-xcZj$|g26T?_=sPK|o#V}`pY9p#T z-EmPs3A^#wrI!qGT&)2dO~yhj0KR+OSlHtY!BCsf)D+JFitI|`Gws9>WAzp^Edwu%*BC3sJoB&+oowr;d)S2?SR&k}&7Z=D&x2zqwe0gZ0qj$VO8{o{% zLiknlaA+?xg6v3|?>ZEtSJOSsN2eNz$JK)h7c1DS6%a1q3Z=ig9 zll^wM(Q$b2VogheK#oV6vxz0}p=^T>H;ZTuD;57uqxB=1Si0Jz z7i0m+Uu6?@a$&~|Y<-aWh=JDz@FWb0Um-4bLp=T4)=2Jsxb-7<0$ABR@*g)BdrFi) z2XBh2Rlrw&Q*>Xv2{76MyBr-IA~!EPGl zHC{|~tN6e+0McHyPD^}8UcyT!r!t{+@d)qp1EaXjOj;7?sF*$xe03&lGt#^QMwZlh zMv5{{WO$-W^7qsl=kC;9Gfq4|FyVn{?^*qJWcQ7~ITO)Q8#V(#t#HMo1p>9279>{* zi0PDz<&t(mce;=`2RZKjs1{X1Sc?}KF=E{XXuEXB*y#un1#M59TwpiF9=*jVxo1`n zf`$fWB82BfARlMsiNunwY1K#*Nz^nUbSBFiNCP)ZJ;d;_Idxy-1FqTd;jIP&G^_Vl zG}J~fDp-^lg(+ulC4~yY@g3zl*=@Llp1;+Z0F~}A6;NQqWof8@lyXNeimCq9V@4?* zk%3la#*?SDAfXw1#^n-~U21`th*;gC8=vSSoA_rBTM~9Z#@Eu;e&rqZ5Hd{*>_~|$ zzZDQw?+8K{)~+MCp~v*XwzGH*Sur`LKptyx2Ok}`PAC$?Uc?AyM_xwqfoA9Fk2atxabpL%p5pZwVo#uu-EX?_#R(!K4AP)K za-vvJI<>E*u_2T#YEAH)I!l*CGS`PG6c3|=Hb6QB?#(|;0@NxUo)tzNzvPBT)=3dT zk*^2=f$m=mTAMqxfG$YtRlM_NWci5^@m1CBXX)VCNH8*0bpO20v4vo4)D^UVV^~{M zD2*McQ2mq=fg^FHl}jTI-fP=d9>bI}#OQ?EI9RAF{G(eN^)5++ER?tq2ZgHxf$Fv3 z13V9u>nkC@B(fRM70(k_NZ5i@!lm`73IfK|f3~^vEr&X}%h7^uwY>!-{aZy+zyntI zGp?9zUmgOd!K~G3pOhhOZej8;l|~p&i7+W3gc7rWUTDcl$9tqGTuKD~T^w{I4gy~a z!n#O5i7V#k6Z2G|Z+K1Kuf=pM=#dL|R)0d%Dg+stPeTEx&)1F?XbOKvel03kx(*S$ z5ZYWAhl>`F9jYcFEvWk|QS1hzUS*iZOK>o3lKAtO6hJE7)Impl4i&!SD8_;oFA5an z8~g^d7oR|7?0OVTg~H8%RHh9@Jn1Be<%O``Ax4vn!zn)zz`{Dx&u%YOg4IyKK|{zR z<*23M#RBscjbxe6&cr=C0T_?}Pey+oPQ2Qbh38-R{pF$Sasy*}QHfmEm(EMe7Ms5_ zQ!BlFYTU0JFlCPlNVXZ7hK;_cmvtGDy6U-7a&gS%mC?OSt00|;t#`iTuE5R{@rFK6 zaV+%UiQ5z4BvZ5hZ1owz=a2_>?X@>s!ZOZ6f+(5;ZX-3C6>g3m6&%NmVlK#zzT0(A ziUppPBS-dM)q4j%LGji)+Qi%4VLj>Qyp>3P>l~_-M$P1fCOF)zCy(Gym!0GpS?l0f zA(J9NgqrwU`nVBZ4$k?fBnTnK&}qSzRuR?4hrjidPrbT4MrNPR0mms)KADd(A^B&) zf@WP1$+k7mUiZ88vC6vq838XFs%2n`M^LrpgPUzCCXHTEQ@E%P>7RM7`MqzCCpam| z3RwR%ekr#9KBsb294-sf6_)-^mqQrm_+m+QZK0w+Yz?7jB(153lSV88jQ^qm;STwqvxLFV}Mn zY8x)z*#j>a@;@0T9i3X{-*2q475R)&AbGfw}cbb7{$m^Z{cg17faWmRKC$oc&p%ia6YwZ-qQxhy1@<04$^X z_H8bk8{=7ck_nZbKPEq7G~o1AZ-2IqWcn6umEi(8%7xvRap=Nh^u?IVjD#@fC%F4q zgEen?xxS`fIeSEbCxqRlCD3Z-+J~RA&NI)Yi0t`hoPM2H!hCY2!zJ9woIcd7ByPIP z_3A@Ea_SbTl7u&ZPz>`zianIH*;opG zgbZ)1CyAMPopx*@&Bo#wJNfD&ct8B)x-fc-lZ8*(3KEWmqsi zxET4{1QxN`Rix3Y{r5pgdF280(k5)QYSKMWJ7@LRrEa#FL8Itjh4f#4RG^({_4bN5F?kSC+r zLRB+KDv-fqD?58AF@puBV3Xn7F&#r043;)Jt^#H0->t9u3@>VY^F4kjO^z@c!~I7+ zfMT^Zs{T#1s0>`m1VU6y4jSTVH*_cavf6pw6$($S(t``jZ6t0?$K8%B|21o@)>54r z6>1R?Y!@b;>M}nlaaVLaCO7@V zsKgLhUi8%5F6!}_BC#C$8)o*)Ez(q8JhbHIx_DD-NYAp-mlIOca4HY3;RE# zhg-?7%RI$<4uktUzm@82-T^%=N%Mq}KsHJ*`!r@F0nN&^sIuY2xIME}5`WY}gg&V= zsVC&PY|D4ep~iIzqF&CrPlS`j?aH^4L(t=-EPRs;7&l6|82)Zk>{f`8w6Hr@skhmz z7S3PVny?(hwUUVq*@fFn@;(z+Lf&>EXGR=1zkhDa>3VaC@c81mnk!X-dH)n%ujv$a zX9sWp?dV=)qHdj1V9{|KE}|>+o7*-uuB4kOdR}FieX=?c2PNGa&O`Nj`uo{i(GTAaN_~mR{ z_NPaV$zg8ry<+?#liW$cno>74%J-m>k^ z<)iUTXM&d#x?wjZxt$*E{d{ z=dL(@UE&^}(F>fu-__=@{Jvt0azo`E+q>l*hgRDzyp)`r^3%;qE#+$%b_x4ieVGj- zK|!Bz)DVUb=R~b*QHNG+OpVrmb2`=JrOZMp^GZESs3?3I?G6ThU_YMBy_5A>jtJ3l z*PFC<q!P?mzp`a}d<2Ij9-v5&n< zagJ1pBDa3WQBWlny6UGm{q)xW5xcx#W0w6^=( zkCKbQUZw>bH8F$AdR2t?=W+~&cGvyGd!;QR__6EbK?B)JlMd^R zPgJ@qJ<*)vZ=1KDFAN&z?ee86$#@5UbU!`|ncjOb&>hOnwOBYyW|do*bxwa(N5&qi z_1?8(|51&PR@Ltrttx8n7J7ZhQ#LmvT(R(TJ=Mhm>Ra5!<3>g@AL4Tgp-=0R>-Fr& zJ}aI}HmT{JALhSe#vSgLLEc~GMx`#+QN{&WHII+86N{IxGf~GCLGiK2k*BwfTAQ8Q+r(WO%KbOi z$OxmR#kJ^}(M>*I(YACl>7Kc;UE2V<{Wo<0T?2?Mk-YBQN9?^Lfdx+_eaO?ZVws}7 zuwu1}S`z;Tz&dC+sJeIDL`@Buo*(+;E+wdr9&p~H&@}4~qVpS8)euUHNz#~6ov z6$co4;)4%^sP|xbSEWh>7Lay zq#7&CZuh=%MqW>sR}#vZA!8Y9Ha;ej_o+K%Gf)vC59zuDaD%zIE%BeCD#cqj$v!Kc zT{cfT+xDjNdsjT6WV`RlwI(_#ucqLy^oR5To9$*iMrca+;gOv-!bUD7s0{ zxbi)Bqgzs|>$qffdC6O?`vJHS#1pMQW_Ag5S7t7<)WT(WX6(p}@8k?J8g+0I!2dKg z8}r2qEY#|jB1>&CX2x>q80Myy@1hzW^(?0pe9Kca*Jn)QYf#8Z*OG8Dyv7ne3F?bF zgQ~sr;cu}q7VeI>P}GGR z{V?iKwrLr{W_q8H?k$9~3k;YW7xbH3 z;gXJZx9)U(g=}4XKJHT`F+x7sn&;h%M#BlV*Gq+|1!7ZUfpuxv4;@26U(6okk;t7) zkxCd3K;K5)_U>00zT3CNvd5=|~)FV;YLzcCHmhggmP1@feqF#d}Ui zt^F#0`7nGC;EX4^r%xC+wwN;pe#o z0;nu~s-Cz5U_mx=x`~pl$K~(`tQx=?`!IU>y>jpH`BWAcd5zfmmrrJ;9hUvPf=hgM z9=pkJIsq5wT3)mh__0LoJld4~`W0qT#$EIto4?o>~C!&hq0SY_Pp-7VPD=UvPi ze)2O4!A}SDYVqXYMP#ghSvDJIP^L2;QA|$`PUQBI(FDZ(o`h?Pimv+)dvNKA?PAoz zwipcLPmmLwr(cg``P@C;rK~*49oZ|Ay~fmJ>_2|6TCrtrvB_x)R}^S4Ms``=fAcP2 z+S59>BQZ^Ei=JSbzo9P7PFr?e+A{-PBm{4$+v@#hk1LZBvRRIln?&<9ko-NmbhsXu z$Jup2IXF-4Chx)yl%k{tp?@pvOP(y=TXjKl+I>G}k|9HP)rWcY5bG7(9zIxJjBMm{ zj$qeZ(n4I`?hLtG{;py=%kbFPD`*_SpTHEod$4y#=Klz6BjUh-s^_@2-6 zYY01q6SAdT){}2ly>35O$($J)61I5!v>QtgS&p|p(IWe9SoHE64rpc@t!|1_=52Eb z2IMBMvHRym9ux184KAJBWlp}MF^t?y<98T&SFN@Nr9u-*Es0o*6F;YSaXTKU_ntGQ zS~-0-J#K4>$4<#QE3WiHb6ccgt(nE^?|PpnkBW|Qs_{J0)xVHQ{F|PD>8y}nc{_t%R4tw(@(ri@ zob`temizhW$oYaA&z$|aT=d;=)raka891n)uh6_Mfq6o|E#xYxxB-&o&_uP5gHj0VmbvRcdL;axbkNJgASr}xiaqh~< zf&CkX=M@Om6AJHRw4_ESq30`(Cd_QQqJ4g6;LF)GB5^NzH8t{u7WdA;k^-R?50JkU z1{MP0oW)-)y7y)$K*-Scx7j_9o>?$!m5g57q-ulJf7q#dD04Sx6hvJek>sO)XqQus(?RDX1NoA z$PhGWpFLjZ3y2TpPZTtXDYmOyeA=WtkBvh)4%t)(-20{!^LBU4b)qjZN4gvB%H>rD zi8yX2t#msw~|Oedy)DW!uw zzjLwxU%LEmR2YLP%Bn3?J)CVhW-GNYWUA)Z?+<#TfxV#RYAa@Q<4efil1>TA!=-(A zZ!w2onC{TZIgq#Yf|E9LXwjg54cv3(G#t1x4cxV$mLltq_A5H1qj{|rIw|CwQy=~- zyzv1>%sn9v`S>*YcEs5ys?Mmk5vZ1S#M4KE_0}Bhcj&9vrxfu|`qLLBHJ03O+bH*4 zj_f>mw4XO-9&?e`c(?AU)_QOMC*IfUuy#m?$J31)jdQTejP3W>FK?fpi3}g=?&;>^ zVpY2mSG)UKvnwShrTAd%o95gs1z6QJcD@Z|bJ1b?aPPYqHM7sHrj@vrC$hlgz_r5} zw;{(r{;G>N5)Yr>>Ux}fX3Gu#6dytVr-(`-!Lx^@B zi+4`(;quA{BgZY;pUr4=pR~Uh(Sf)r+f* z*0$j<{n&Mjg6*Q@9-?pk9B0}^WZW}%<(X!>lOiiTj*SLa0sj22zrhdGfobIb?)(4d zzy4o+?EmLK`{yqHKmXMKr+4`O&(%c#Pha2~{->}1w|@s~@ns-a%HU2Yb)SF-j|V;( z!O?26O1F=eU&!VNPbDFb50su?4lUPI`Ytz$7@NO+k2^y=dgAO89Hwg1J(t7<13CF$IXc_lx) z5G?Te0K-iI4S1aCSe=rf&wB6Gmro5rS`i~5{#Fl06Lc8u+V6?#Rxng#eER2tqkWjh z$v#S^bXo&*qldIqr8*j^X`nKnoznC^r36^d<1EMIv;=L=sgUkZSZ5KfQ{W)^O$_-d zjb>cuVB~9XSMW>EY*SHFQJE6E_C<5<;|;ktD zNqp(jkJET(Tf}pUJ{<6s>$kSmlxJ03h@}_lRq$BVXp6HsJj2qC{d1SUvw6qK#>oa< zOhrG9YhDDa06K2Bpq@TirQJXimhYQ#q2%-7LrPkjk(g~`78r0;nw6zz@L{2-y{fY* zpzNS6{JmBb`1k5jo+9^i4q4><`N2`K){qWvNE(c;J;#=!Z<|lC(|E!Vt|9*`gY~Pmm!Jm*wwY{Smom)^I&pNza|0es)GDT55XL-vg?Q!(j6i=n6 zRO$Bc0s}ev=x=n1wq~BM&EXl>$Rwj#_VNKtta<`cdvZO)vBWA{#XwOpu}C+A2qvOy z<^N$pGGn#RWi`5~PkwNeXAP#=70Qpy3Mw);{`J)8exXF}+lQZA{MUkC@_jqM^QZE`j!x9xyFao zgDJ^cSb~(P@2fm!9!VdfWRx|&=A&?uQjtMk{1b96^))UXL*`k%R$XxkI4N<(AXCb| znSj>0Lj3i#N2!Hb_?j3_^;f!y#@Q(n46k`zO4oUO>}X0wtaR@m>F~))TAkoFj5=gX zIb8P#0rCa}Fs)hk%SWO#MU1&MbQ^>l-(rGyf4zGP#YVeQSi0V8{U-!dh|6L$_P>8d z8HwG_KR(mr?h8{+P4lJQ@A|DrT>38azQO6bGO-g~`x;99U9p#!Pg-$bN(3h-2+}(EWL|%r;DW+l&OvQ4c_7Y`{t2*(86zq*WbQLm56n?t^%&7KX;6JOONB`)hnizBrE(A zO*p~yY5avtJMcz)&r|FBrvGIrkGo@H*M^b8BD35jV z6emS!yVjuH(xL)2QGdJ2sDzfTloqSOJ>Mzgv6stHdwTCiukL8~p@n8e@Jo)X-wQUQ zqDqE^As4$b9b*3e2e;Zgf83JH-5%L28{%AVKS|yFh7=jlOfDV`UN7U8JvY$0e5zh_ zoYWe;etVFoG>j-^HXGh5Mq9LApYTP`(DeR44jR1fMT=x%&r9?eCZm*1CG!s08?sTT ziR2U}KhvoJ3Nh6B7iz~vzC<2ODlSiJeG+P`;!*bv86Cq%Bqz=iX6;Q$sI>9hzizO6 z;Q!E4q0D%v?ip&#Bo!uUse(K(5<`57nHv7ViT^p=DJ;h?dyVw_XC>L9Z9V555vC85 zm}&tHyApl@?&sj4+P2@zD@G)6Ig^3+(yrts_O}`PH?Rg>vcmLO)#Xp$-9MP|v=4C* zTCx_GdfBj=DHcg<<(Ed6cZ-REd$L{*k=LB-S1FQ4z8;l`O0>|?eAGE_&L|_wEuzcd za6LRbl(FC{B=YLDW7Ml~pB(&f6T29guN{pYi_Q!}3KD;>!B@jqfiek=Xime0QWPaq z4>0N4BYY-IOQb~QeShcqPr7>Tva3_2Ic~)=3b7XRpMMN~?3wa~a=2C-%ETxkne&7K zqi^s5Q!60HQdC;T877teWQawSqT)_q75!JS1P)ylMp>PIUup?;@WxwcR{#5StNuA7 zz^(FP3v(AKxk~8-9nxJ(Tm%+PG`vp^Oj!M8g}LpslQz`TTc+BzF4K`8M|oJ)pFq)p z20`6njIkrWX7_1|N(H&E+$0Fn1|1D@^EF8QrCt&9y6iBcbgIjV@O8sz`YayZLz}Cs zMKbMJ*Uz|Q@J^PH(_j?LOG+n8ijHWv{2Sl2{8mUYvDBDunf<`1V602}_C_*#iFLl% z<>7t*|2`&lM)hHO+A?b{O}dR+d;d9YL8f`fTju$Jqg%TBC^;uPKT}~qv4hEdN0;ew zGUDut?z_D%{meKC$cA{a-=n^k;Cfwd|8u=OwDBZ^=0dzO@->-mZibRMi)WdRJm8E2 zslwBL-m_iZt5qXhtG}K8&?K24sKg|oMYDI8ORU3_R4d2ODcsd5*>^Xn_2&cFDiu#@ zX;x8D_o+l5#rnL+QadulXJyAc%i;lTdN|#tL<-DAgPT7a?2#v8=;?4x@f0!DD-8=r zGaZlnS~MjQM#P}$i9(;^j|aSK)2Q70IV9VbBz@WDg*gwRE8St4xaEEKlZy{d8~ust zEGJ!})shs%!tGd>UVOF7E=o*$faJPWp_>50666jklUUmD>|aL@cOMU$F_O?HQ*L}4 zkXSOfZz}rm!PPz8N^9QkE*M`DGiFJ@?VfJ~*2{AJM`XZO_-M@HmxB$#=gD63|*tzdtf+ z;CIv|f52`6VUj;jy;@L^x}`YdNwJ?3CBOSUb{HcaD7bm+{1G94wYV0$F@$uJS7uD@ z@icI??~&I0ux!Ftx$jdYViJpNAGEx6)bo43 zBt~1jUX;M4nObj>`fe!wTPRv%NvrE&36_>8@%X(~a9QnNc9~XlTthwwo(H2^;G8Jd zVvL=mZ!v2x3eR%#*bwx5V3a!h3t#i(bo~i+j^l!aSjQLhhGussk-jqptCoP|kJfIZ zn{GVnhQxg?l*423^^}>WE~OX3+J-f~Y?^yQZq?jcU=P(BNgJ0+{ATtf+1KV|jSclr zCL66PiOBomS$|oHGjCuhru8!SG=ftzs_cP?OWTr&Zje_hZ{ZK&u0J36qow&=vLn;# z#ArV=kL##T#Lq~$I%@AoG@EM?_c!G;wT_4&{YzO4h*HKX>qAHTAT2lR__;?V+&2in zJS$3$a-FUZ&@H(uvxO#9O+D!28dEXvST~>5-w>LL`f$-~Xgb7B$x;qExc8ZoMLQ7esW7stE9v=o}M@t{`~=KkA8am$AA3A60#I zR9joHH%@VPcPpg01uYgVKq(ZbxVvkMyHi|)wiJpKDDGNZiWIjX#T^1)dhdPfdoO=v zot$;f&YUx|XV3g*_Ds6fX+<3`LjDxh1S*JsHnxn`5wTgwRv*!6!FDM9|U1j{|IZk)MUBlR4Xe_jZ^+g<#Q;kU!!&Cna#>p z%!1oP9R+5~OG_S(W}jE-nU94CbdP`LXXj=t>DLN^Y8N|>Az(y^y?kI_=tNCaxk_S0 z%=olsmy$m6$j!+F=g=J1LNO?IV$K9gGq0^OF;ZQt^rlfh_4w-uV`UZpr};UH4=APr zZ{Jghg5GE=B>yMK2_x{gzV6wM5D5lPrQ=o9=p@vG-bmsgDW!~r2Ch~DeUS@$KgZ>k z*y_NAAEPK#OJq>qh-3?N@RRaTV8=zivPF!cBx}1}Dv7vZIW5^S+v>xa{sgWDMEGF2PN)JYn!HPHMy`+Q@7I&|Tq;<_$1;G2CTmT&zx}6zp+K41gLUyOA zg1W;2RDyLe)i)^3@5|w~fSd+RRqAWs(z8ExVxu|#_zxht3MVEVsIN<0Jv2 zfUX4h>j&HQt|C7*Qi@4&HA?B0hHkZb3b!m)Tj%<>@o?rh-+0h)=!+;(o}wied+pgO zN2d(reF4o|w}Y0B#JHJ5Abf;y^ERdVYLi~=+XV7*HR4ts=z9BONt4be8C!-)gH8>L znKnpnb; zP+5@3w#Z)(w=J~vv{=(g>Drp!G{za04u8@_v1Qf%JO5k%Y84-CfcC-e=}u9Ia{O5C zyq+wdZ&Zj+(~;SVg{o^>nGJO;y_%NuCCbZ;hrcW+olxczb!lZv_vdVSN0y!p5s?3f z0i%Bz5PwkW7>KJE_?c_=S)R9GqoEbAzzSzL&xitPM-aLHETfd~U@SeEXUtS^_<%`E zkL;JqSP!+<;)bLe!tY$cv5_`Pne6J3D77~<8R4{B?f**iHa~+8@g_2Zk2MW&Gm46I+I3LsGaw&T6bSBkfFndboj{H5g9MmSS>t@{k`(`ZSfY`kcO2V zGF_qoQI#>=wVFBzXZb?N*8+w%C>eL@`z~9~m}II??_<2x(1ZwHol>0$lzM6KDI*QA z#K&c+DCNy+9k_%1I?qb#jKZV#ZE@#7Tgj~Ru{T#pr?hPTQQdVs zO9>}N@TF-WHc+Rjqr9VLd8eSqF^4Dk()XJd=csaJB}-Zn z_C~P0`361VSaf=yWQM+)RA#x!o0K(ZjT#tkoL^?lcY)HDRUtibDXcgWRFKd+ z5E%4mj)jTdEB(4mW{=fEZ7|no`sT+i&nt}~o09if23(t4Eo`rMW-rOWUvQ?GBdYlH z1SVK!RJ`&>OUVvfaMA&)Q;&Gv0WpP6#IF_DVBw#iDtm|zgg#8p`w_$(GHhjI?PAQo zSQ7WF(O|39mZIk+muh7ll#J&E*lE1S^i1t5TWZAY$9Yh*+n&jkKPC3_)o7p0WV|!S zg!!N49qS`$i6vwZ>D@}%b@BoN_6JYT7*(I> z8T>D^{f2)My=*~K5I;L+J#AFKp9Vj%cRU+dJH0=Rz*p>dqDx{!J=1J=HFGGwP7mAc z-dL&${p{Ip8{tYe(yh78*6TienUb}avL9Z}pd}5PE&cF%_Yc0`151+b$Ye)MjqLsb zWR6dOU>iCfHU*eYN=8$L!MFCezQ|`^p|jMOx1W?xf`}tWlt-CyzrM2}5B8T|TjSJ_ zlulwg53G5ZR3NrLZykS@kjR$>;8l>dVXPz<9nc!{nwmssGI>i>RB21#i%hf6r{Gdk zQ_>O_iZ}{@AU@h?db?fJdMFb>z7{*#_r1vZIY`AUX5HKC97+PSA^8Nb!`IJZ%Zh`r zpr24R!$%6)=Mh87{6$MS!tR>5Rt&Q4H&7NSus%8Ik$1g^T+@178|y`1&$rv9AYqlk zkfuD|Wo8Qb^X*A2(ukT^c=Ix`;=|tvE>Kjg-jE9?(!r1wgUFviQ48XJcLw+y=GRlm za(usk*;7^S`xfbsbQ3|gZ$O$J81e}ex>+b|y*JDNVb7=bD{9KLoHKsD=)h>XkYi0| zt7U5If7xEAi#w-Itqr9H`Z@@wl~0bEU2O`ShwEPRSoqEubPo~@&dwoi*n+dtaqq7u z-1~XMj{|gc&wePQw)_(Hb=zrpm7nYSQdJ?h_Kn`#KN72Tm?Yk68^{OpNj4Rz5=6y_ z&X!n9l~hEjt6f9Oe=g%^)zC+{N}6ZKSk|*%D+q9yx>lCsR>ZDzT=Gff50v8GhvSAW zrvXnCCfN#R9+*z{L@Wh*Q*{9)@FJgQ^*+lfT7V|xkvE+J=NH@QQ`i&zP!@i$F~!ce zaLbv|)Tlhha*Xzup~kGFanIO~MA~hBGQeb&=QN5MV|;L*@ZzUXwwgFAAGg6;e2TM! zogkFZE{o;R!+)vWD$7O*d2%H>@b|PaBCkwIxNAb^KL2sw#DjgJ#he#@+P4zHJyP#W z7??uN30ao(=pe}V=bm(aLrm}Mb3Vk*7zIc-hDN3)H$e!E7?-@YiwzJa_Vxe-@)L}Y zEL>o93W=6J>ROWxtKumGYDsxv#aePmF(s=u>Uw(+cuR z;Dh^0_((SP=lQT>dAucY&WeY?Z;T)K6NqJ+%%CTA;eFzg1mZ}Mh~!nm{-0N6K&w=x9G(~;N zQV2%f7cV#S)lGzoF7-oq-xJv>B7gI-ki+mcAuYQ6f%+AOc4ExkG&xH>IwjR7A2Rotg-H1);S2oW}eFnj{$`Sv)QvMPtP=-_qP`=rZ#lq=lanKb?Pg zN(tRdc~E(dMbaXDMZEz4hwjzgjj9aWj_v}A=Y6~c3+bmcu=GDWWs9^@*D-!TYxGH5 zoVsD;*tXI|F*S{qZ!|)g7=EEor8RVbhV4K&8{8kTQqPGzPxPY9S$wKIPSmG^yd9;p zr^c^mB#m8<$*eZFa>4gyevb+5xC!5dp<8h6&6SmHS$HRqBwu9*0AMfYPVbD;-@2Ro z5F+=Q+a_x$WTQclwFjZ)#ae0(rrSYnKjozuHI1D0-4 zyI+SAXixAWJ?0YXbr&pQ!?`|^5phn6ADP?9+uPEt^lwLVVU{V$d;I4ad%sly8J*kf zS-oCl8-U-yf-v}x9}aLU^~e0Xf!s!yU;<`JI~f%P<`=`3P&5~SDorYaJEd?IcM!a> zh4dob&)k9UO_tBLznPi9_6YHw6fvzU94}A-;EQ6k13y%;nI=_p!dv3Cj<>=h&b;=H zJ@VSE#XB>7`4F) zJtoDEsDtbCdf&)`^0(?aE8s0P&I3GxU1e;tC+{pvwkUQ1&mK_GM#^Q?z0-`df)2X8 z$E3_@!+dJKWuBVO1;}Sktc1&TAlW(~wHDc7E@XAh!;hE8p|E0p zzwTZo#s>y{l07;|#XN|_MW(!-yc%==Pk=4tkZue*ds_>!9Povnb;CE+sqQlZp;vj| z&bja{3@5|A9X>Fq?J8g#lq2h}JHY^a zY2bmMAFYs;Z-e#}dnm3P(HnKBUS;}px3-#hu4N@qPgzkCnc{HT(`H*Rf?E{pU&Orp z$jntj;g+f%68C#050!!$g!DrrA|f_nn45_R&18{&yof9f6@)TpzJiA6J64&IgB!^8 z_Wt+BeB^CS83Yz*g1A4I21um8pwM5aS?kI1qxElDk!oLzI^OPPt`0^#cZ0OB-XXikjk5=cH#A`;7sY1UfMjEFMs{asv?id%R^lH!( z`#eVsI$o_1%PjVYTZ$})uf_zC#s^PhfvgDm6D$t|*@O1kP6dj}LEo+lHhzsNlZ>Bq z8vxE6MeN<59jClixOc_Lx7QpDTy*q@hP(Lq8>xEvhrN7#mjcix-*JoKKu*a__+bT* z-Zh+>%7inr#w@R$;Uy>L3DkSIrtFJD-c(bYq5%Ee0I)+mDH;lPA0Kzr+1xS;Pm}Lj zqiN>nQvyBqVJuh^uYy7QkXzi@cH7uGBmWHFU&dGsk&>FlL1i7&4yGmVf?acv(VJ~U zqNa>flNL<~11`^C{f?8FHx=8?j-8$ZAzMDiLehF)5nI(TuFh?q+*Tq8g-liXGZ#&K zuIi+Ni%ybOtVCk0&4QwL?~We-S)REWlIhFnnhM={vGF225>0OZq`88S7T%Mg3G3K= zC~QUURbNi^sY8dbS<)@Yy#%|Xgxb4j+blajMtiwThs+NnV2_H{8tF=l1Ix_~U{YwA z-mG!KO}3L3YXh0Vo=|Ep>1Y0Y(aPiX&yf;VzoUfaI2)eA&O8*mwI{tmvhUVHB939| zTg}JuKvc`^xRBwTw<%%T4+_hdgqB-hZfG{IHdA>x3^9$1bEdE`&Lb()Uh%f`Bq4=~ zR<<*sBF>mbUi6ujBaCsGh+=S)`t*s;{R-k6n*noEql5{ZRdG+gfyJ|8S3!{>8p}8v z!}hJwK#E1LwY!gs#%-OCO#M)*{&Kw5%IdBk6vu#>PL(EIh>y?)F+JUQ<;ujVVOVEo zNv0d-kIn2&DzLy4*PTV$qDgMf!ER~#n#nh5V=Uw`8H1>ssl5#Vhws3h3evUO-?rHjY283NO$^==;GUcp=aOYrlmQn0HN>Mxj7tXjx@Ao($*?TK&; zl6U|R-qYYR@6|@}e0#ova!??08G_y?9u#I3D-f8t2~eM*5rZYonGjx`-#(cc6Dh#%A?)=d4^fJ}I^k}|MWp1%| zi0k<%Z-r|#baUA*Q}TgY)m(iCY4xGn6;I&DtB32TRbbdc4>RPCda>l_`_`X(FH_pS zuAls%lX<3ECAXWT>huW4I2DMTWcI7d&l-M`m4rS(NuC1Vw%)1VLbo2UqLC@jq7%oP zcO~wH?h`N|v0`Z!l2UuuWJ4!_(3%pTnHGL|0rdiQdtS*Fi>H(CH5p$|AE^$y)nc%y z&8|0_b@r>to|Zknt0HfOd$JekXBnARe*3VUak`pHoUis85c4z8NpAfwb3m^NN_2$& zq#FT->cH2muUQ>}Wlh zk}x*Oj5@5cnZZ|EKRT03PGX1Gas)nyO5MbuI9#utHZs~~Ff1^+&hbAx>OA1A@w~PN zqQIIFmm-k(l0AzI!{_%WX@$Y-`&0nfGLq+4qRsNOu@tumhxvd*V}25@W* zeQEmzzOsJ_e9sCpFFVD9_&?|@dNYMRyeKtw!7U1|#}S10;?q2?qp_a!*W+Y&p^ovJNL?fO5~C{T4X=k(Nyn}oii=)D`1 zg&q%wFIV%w*N{+=D!ej#3_qVO99=+Kp`Zl5!%QVWBDr%4JA&mM+*ouZo&es(RX(}? z=^DC9Jtq@WK6b|c$<_K1%xRV}V&ZoC^B5qcp)*A$o)@uYl8x-tCde`tr*+kS6~Cot zs+qKJyk@%5`S^rHBo|XHotO-Akpt@IkB?nzJM`f-vf$>79015`-m(Y&S(3Ig9J_S8 z$BO^eDzRHgqu2)u&E{z@83h0a{*z##xm$I13~eUHs8K?;ihjqoij^w|yJ@S}BXmr$lA1zUg;+Vb&Eu_m5 zT=^SHYb?V06Mhlyjt}!+ld&0(=HQ4MpD?f7Pq1~ik^kozENR!E|B|GaemmnGOGwf; zx4wi<$ec6S8)mTZjrC(9+e%`aLB#Y!gfM4BAt5@ph8+7wRO*3XFVE8M38_G8%CIAy z*aKyni{W0+`X1<)lD1=E&DeoQ0S6tJhSIVXpB;RYbw13_>C18uUhT)R9F-+Wb{9%x`@# z{N0C6po2PA;;+REEbF5HG&n79{=yvG=5HK75WK(~m>BtKvnfDq=H^y6b1M`TAyN2% z6bRAbF-k2FS?N|y8J9sG9|Qu2CsGu^;*&)4zZ-aKGi>Q!YW;`!PTjY zFY-U-JwgUT87;$3Vw7g+?y7|p0J}A4X=}oHXkw@n%lSXX~0F= zR49}sGLG+%1z#KvQ#{u4*LRkjO-ZZ!Q?~=_b4l4CRifO9#)KA^r{B>+FOtQ|$EHkt z?Bmm(>hKLR-%$G#)2WRBMBTFgaiwMJLJh`Ne<@OJ@@UUn`iFfklsjScKt2d&lKPM! zST>YR6f$@_SJuttW-*H4^d0M(Y%5BG#7~&?ZfWa< zM)iyQ=B7&{EHra_p>FxJzV=vj7OG~X!5JNhx17T8P|N&2`x^$IFR3LN!{ia=p6n7~ z#*99j)g$LOh;b)_rg0nHSA1gKXXaGvU%pY+Gx4QaOH$|w2Z|A9z!QT2^?r6Am16Wc$8ai?6%$TyYb<- zo4$sEubcj=e&}n3;`yO>_P|E&mwXA9-%;})Q<%yz2ywm_vXq>~Z{%jr?fVan3=fI7 zKWJqdN$|$=qmgT#_&P0JE9XA=ZEjA;S9zUNiY+Zdo>j2cIIP416p)G9)I^n)-X}A#rk1s(Q{XwJ8nX4N+V~q5`$QUxiicJ@rCxw z=m9o()UCcMF-$3%lo>Z~_M}Y@KFI8>jERDm)gWXovf~}$nRhqu z416m6KtyD2L+tg&yJX_^hw#Wm-68xb{1KK(L>)W6541VxLM>~71zLZJr#K%49`ODJ zxGzzns}oXW#IpiTLfD-9n?2E05lY29e{oJqdg5#EV1MkPl%Wc}_{lSGL1|)IjJwGF zV-jVrs$k&-1zXR|aHc`PDGQswrMztoR!b-!m47R_>pJg!VgOl|ImP6bv2q*L#wn4evZK~}hu~>_iX-0sHn7qZS zbCEHR{9GaLzw}GO>34+F-wiC#pdNjXRe3QA{C6VyWrwwbOTAaJNa#J(UjJ;KfL5T) zb=k#E-EdFhwoWeDPhC-LoKYs{Dmc_#y-pey~ z)}Y`7{+xR(S9eLRLS;B^)qeD^HlnENkK#Sk7FI6}J)yHaHCI6mPEhtO(E5kp)YvRv>rJu{mQ@j}ZAkaFY za|sNQfT*l(k1nu?%j^0;<9WBrNV>t!kl->Lg<(d|+toUPu`&Vd>RbUwzU6y8sTy?} z3t_^iKkzM-q%tGwdo~{MBPzkMXI}5Z4;EkCyAGr2ItMZZ?-^rV+G?s~XU=uy&`!TJ zH@y)Q!cD0niyEAqv6u`>Kpu__I0=4|tpQUWi6z&x9*@p~WP4ouU8NNmls*%`zgp$` z?Ryn+5)y!eY2>aMe$fd_6Q0TSbDihjSX-3SRo*t@37>V4`T--3RwtKnf669DaXGAXfTxr^?f4XV!8|ipVsAX=iTyA_j$HQp zx#wNIABfM=`FX-_*_+~A97ol=6ZuBJWYCLAdLLbSb+st91^8iHXsT0$XEB!>Tb--K zz1IuIb_B1S~f`42QUS<%xGB9_Z?pw|)`nqSk>V)z|o3o&eWwy@0*v%kr zJiM4v{4B_~)9~#vMFH?Jcc3)G5I77@=|uMq%t$n}u*c0W5{;Ki7(3mb!m1xnTUv9( zG#E-Z;hU#?f2RNM@~!yi=pGiX@+WcVC6K|gGIkF?>MYSP?CnefhG zX^M-jQ2C4C5oo4M@CcBqVhB=bn%1DYje-w7invb6;! zH39-oJxESQJH;W!XH%cPK+lqrL%p56oP^zJzVI(JU%5ddQHL_ZCb5#~onm}^WTnCS zC{`}!aic6iKs9dL7$ePI(k%GoQ4~>8dm{F+$#C2xaIWawBh|Aij{O66GE9?BLGD`Y z{P+IiZ~>?~nP-Ri;3~Dc#-|L(5*;AamQ~hdD((m+3Z^tF?9?t49=C1fxHO}mASp*E zS&JmjeCIM(76?%HxwzbMiCZG-2HhO>H=jE;9=fp zX*5kt#Hy9dW@akOI==H^h4#mfXQ;8a&lmbGge^^Vb?B+Z<*nkpy(u{`a3=baK~ATZ zrkUGd4r5{MblGlDqT8umc|a5pj%8kLD!luF6Z()Q%Kf==m*TA@jD>@zZzn^*598Lx zLH%{lO+`tv!!z&x>d8S1(Hjx__@T!h76`QL{=Hp1wrD(4=P8sWbH?n7k1hYU-Y6}Z z|0}^Lzfk#Ef9ZG(Hn=z^Y5S|vQ#x8&Ipsou65%PvD*c@FvW0>#bdBTn-Ga-!tf}-{ zWPjAWZJL*uN-{-u5|NQJU4)AqRLrI=P1+3=jPVHrq*INm7Q$1>vfr;dl(33q7h5F+ zYV?VJLIQrG+zjJq*9bsY`iZ*|jG5&x$TDv0xt?~pK>!#4Q^|gtU-;v$<4ULbblZWf zdkyaQ8y4%|mC`$$TSG(~+BjUwfa*A;eo9nY%|h4xT#Q4Uu@@&!gZR225{!h?YH(%FtMSUNAstxRJSe@B)-kdsaNfC1n0RO zEbf?YmhvBq{ii2vTWv4RU^STMvnHEZ_$U!(&Rmh`@)gZsuun|>w`Tluvg$JZyhY)W zEyxs~TaN9GjzAZ`GN5}al+K`!6zPi|qj|Zz^vG|G_z970J6t-Pbb?{gODo@|Bf3y# zzSQ})9!YHg@Q&qWx$8Z9#veu(!UX?1c%h8S%IiB7ha=S?06}BU5rjZ=td!n{bvUx0 zX0M*tZ({_2x1xP9O9^bGDkVF9>?tP;R*#(@HS}F&%Ktz$Xy(AcQSLfWtC!E)c!~#0 zS%{}dN}ez&c4Y7l0_oW^57_?`S%0+1e=EIe(_{KGZl?K=VAZo&7x4oQCqsA~?pPti z^t#SDX7C!vv1r3Mb{RfSp>WCveO6R!8=IW`xQHY4zMOb0XL;mD+mD~M3;lZ&PDPwe z=8=PuF)Hr+qmnfR0|aQP4n+Et&~s5`23pW5iB0&!kvCj}NZsEkbi2wb&{xJiI0|4@EmGt`!Ie*!jZ^%$P6$w_y$-w&ARcD2Ujd>wdM%cF~C~1a&ecLtr9Xa2K#CI2@qhzQA7l9_~uhQK% z!WjK0uO+jlo1zH%^|X)L{!FnZwzKq<>BC%(#g8%%;E{-X3%F^FP7$+)_R6XtPlU^3 z{w{oGCzb8AXEoFykry1X-P zwW9dCmXFT*6yHiq0x~%}Pls*h75CoSmwa0(G}hY9U~gyMX_!Qg$pu>5<0ps=q|P*_ z%DtF)WzZEtxn@=W9I>^77<{(alY6f6Nk5d!80)VWvBQ?VP{srZ7!yGIVfOA@seF_y zl26~OSkbVJKMqq`E>0_t&I_BdrOm~nb+@^sHUwiH(CA8GG_q|v^g@0y&XBfI;>t9s z2}xP3ajA&VEe)f75^in4+Zxl7b8a8D*$Z|r##pe`BS%$MLdw+j(b{Xv@02*E=EgX% zc#5YsWVzy@+%APEjgef|P+=f%I95xy-z-P=LlHFTrC_+djH-OhPiqjMr}X19ArChq1uJd~9-x+hPf^QSzZ zIExg{gp7IZUq#(Bszj8}3)zUYu8NkMU7t_?C~tguc7NffBgxyPjDSRODDe=%tvKaC zM)TGtVAG~-W#$*XS*5sEMpBY%RYloD2{s%%v>i|FU;!z)A)xe$-l?K|>EUey-&Z-^ z5N1Bj6x}TU)IAbW^YrW-m{Z*n(YF>ykx1)6Pq4prsWCrILP+*Mb1dCiVGUz-r&*H9 z+z(w-ThIrDD0J}CtiU=m&Cb7x*k8b*l+Pr=sUg>HeQ_4q$Tm)28YZhZDDiG+4uFAa z0;=gGW3(sMF){PYXtp0@rPFrbw_d{XQ9kQL+ASt}=`#k~3zP1rEvTD@;XSYRWbm}Z zDBvZK4V&q@*GuF(YG87RgA`PQV%URt+Yle*dcsHQ1WRQ&QmBDxi|^NxTqMHe7c6mT z9U6!_djdf}pGq3AsOerwvKRwo1*S179yYF&IF^A@g`Xg=txX_IwNbAOR~=<;rZW*o za|$|N_9!~$lXxAXC-iL@1myDE+Dobi4MQQmcJV(Ob3{8|GL|m}=UggZ#DAZ87K)DB z%0IOjw-xm%4yJ2rA4STQUgQpGF$zVK%+qu3qdvAA1Hk=v(f{TW>r0(gC3=pM;cX6u zU{p#qvTv-Flfs@AU!7!9LBDT<-ep*1nVf><{RZ(hbd%2#1UeR|h5UTEib{M5%tIM^#?;ZU|>;;xB`iWngRK6@~+ zD2V$R6uO$iOu|!UjJ)GGHp#t0ar|CskW%yR)vZHGtvymUya2puz$(E*K9O@knmYhT{ z<|wuVMVdRj0vo;xvS~<$8e+fC#bjV@O)NIvzA*v=W~;Zi_i#M;5OcmOA8f|mW3?)N zdaS-Sh(7dU`I3l6bxIhGg?U15Q~j9IulVP!M7Z}`%vTu)R@r@N1FWlQUhiGl{gkr0Cz8pAaOOBwNE@+A}( zuzi)eha=#%Ig6aq|2;2WXfkD`(_>2ctS+s_T5{x6jKOlK^ KxoTO{kpBmmHD+M| literal 0 HcmV?d00001 diff --git a/docs/_static/img/analysis/report.png b/docs/_static/img/analysis/report.png new file mode 100644 index 0000000000000000000000000000000000000000..6228080262e20b7fb26de853ad4525ee6773df7c GIT binary patch literal 151446 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