mirror of
https://github.com/microsoft/qlib.git
synced 2026-11-11 21:41:06 +08:00
* security: constrain config-driven code execution * fix: address security test and lint failures * ci: restore dependency and title lint compatibility * ci: handle current MLflow and Windows OSQP changes * ci: use lxml release with cross-platform wheels * fix: defer optional CVXPY solver imports * style: document intentional lazy import * ci: skip broken released OSQP on Windows Python 3.8 * test: make MLflow client timing check robust * ci: retry nondeterministic benchmark smoke test * fix: cap filelock before fork safety regression * fix: use filelock release compatible with multiprocessing * fix(security): restrict operator lookup and validate trusted roots * fix(security): preserve numeric expressions and legacy model imports * fix: preserve TRA initialization and document config migration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: preserve safe expression syntax and cache semantics Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use explicit scoped trust for file modules Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: satisfy CI lint without weakening trust checks Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: handle escaped file paths in module refusal errors Match the repr-formatted module path in refusal messages and cover Windows, UNC, quoted, and newline-containing paths on every platform. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: preserve expression parser error logging Log ExpressionSyntaxError with its field and traceback before re-raising, while preserving custom operator NameError and SyntaxError handling. Add five regression cases covering logging, exception identity, and failed cache entries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: isolate expression logger capture Capture parser logs directly on qlib.data without propagating to parent and root capture handlers. Restore logger state with monkeypatch and retain exact single-record, traceback, and exception-identity assertions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(security): preserve malformed feature boundaries and reject unsupported literals * test(security): cover malformed dollar-prefixed expressions --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Yang Liu <DG-git-dev@users.noreply.github.com>
145 lines
5.8 KiB
ReStructuredText
145 lines
5.8 KiB
ReStructuredText
.. _model:
|
|
|
|
===========================================
|
|
Forecast Model: Model Training & Prediction
|
|
===========================================
|
|
|
|
Introduction
|
|
============
|
|
|
|
``Forecast Model`` is designed to make the `prediction score` about stocks. Users can use the ``Forecast Model`` in an automatic workflow by ``qrun``, please refer to `Workflow: Workflow Management <workflow.html>`_.
|
|
|
|
Because the components in ``Qlib`` are designed in a loosely-coupled way, ``Forecast Model`` can be used as an independent module also.
|
|
|
|
Base Class & Interface
|
|
======================
|
|
|
|
``Qlib`` provides a base class `qlib.model.base.Model <../reference/api.html#module-qlib.model.base>`_ from which all models should inherit.
|
|
|
|
The base class provides the following interfaces:
|
|
|
|
.. autoclass:: qlib.model.base.Model
|
|
:members:
|
|
:noindex:
|
|
|
|
``Qlib`` also provides a base class `qlib.model.base.ModelFT <../reference/api.html#qlib.model.base.ModelFT>`_, which includes the method for finetuning the model.
|
|
|
|
For other interfaces such as `finetune`, please refer to `Model API <../reference/api.html#module-qlib.model.base>`_.
|
|
|
|
Example
|
|
=======
|
|
|
|
``Qlib``'s `Model Zoo` includes models such as ``LightGBM``, ``MLP``, ``LSTM``, etc.. These models are treated as the baselines of ``Forecast Model``. The following steps show how to run`` LightGBM`` as an independent module.
|
|
|
|
- Initialize ``Qlib`` with `qlib.init` first, please refer to `Initialization <../start/initialization.html>`_.
|
|
- Run the following code to get the `prediction score` `pred_score`
|
|
.. code-block:: Python
|
|
|
|
from qlib.contrib.model.gbdt import LGBModel
|
|
from qlib.contrib.data.handler import Alpha158
|
|
from qlib.utils import init_instance_by_config, flatten_dict
|
|
from qlib.workflow import R
|
|
from qlib.workflow.record_temp import SignalRecord, PortAnaRecord
|
|
|
|
market = "csi300"
|
|
benchmark = "SH000300"
|
|
|
|
data_handler_config = {
|
|
"start_time": "2008-01-01",
|
|
"end_time": "2020-08-01",
|
|
"fit_start_time": "2008-01-01",
|
|
"fit_end_time": "2014-12-31",
|
|
"instruments": market,
|
|
}
|
|
|
|
task = {
|
|
"model": {
|
|
"class": "LGBModel",
|
|
"module_path": "qlib.contrib.model.gbdt",
|
|
"kwargs": {
|
|
"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,
|
|
},
|
|
},
|
|
"dataset": {
|
|
"class": "DatasetH",
|
|
"module_path": "qlib.data.dataset",
|
|
"kwargs": {
|
|
"handler": {
|
|
"class": "Alpha158",
|
|
"module_path": "qlib.contrib.data.handler",
|
|
"kwargs": data_handler_config,
|
|
},
|
|
"segments": {
|
|
"train": ("2008-01-01", "2014-12-31"),
|
|
"valid": ("2015-01-01", "2016-12-31"),
|
|
"test": ("2017-01-01", "2020-08-01"),
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
# model initialization
|
|
model = init_instance_by_config(task["model"])
|
|
dataset = init_instance_by_config(task["dataset"])
|
|
|
|
# start exp
|
|
with R.start(experiment_name="workflow"):
|
|
# train
|
|
R.log_params(**flatten_dict(task))
|
|
model.fit(dataset)
|
|
|
|
# prediction
|
|
recorder = R.get_recorder()
|
|
sr = SignalRecord(model, dataset, recorder)
|
|
sr.generate()
|
|
|
|
.. note::
|
|
|
|
`Alpha158` is the data handler provided by ``Qlib``, please refer to `Data Handler <data.html#data-handler>`_.
|
|
`SignalRecord` is the `Record Template` in ``Qlib``, please refer to `Workflow <recorder.html#record-template>`_.
|
|
|
|
Also, the above example has been given in ``examples/train_backtest_analyze.ipynb``.
|
|
Technically, the meaning of the model prediction depends on the label setting designed by user.
|
|
By default, the meaning of the score is normally the rating of the instruments by the forecasting model. The higher the score, the more profit the instruments.
|
|
|
|
Reloading a saved model
|
|
=======================
|
|
|
|
Training and prediction with in-memory objects, as above, do not require a recorder
|
|
trust grant. Reloading a saved model or dataset may execute Python code, however.
|
|
For artifacts from a verified writer in an access-controlled store, explicitly use
|
|
``recorder.load_object("params.pkl", trusted=True)`` (or the corresponding ``R``
|
|
facade). Keep prediction and label data reads restricted by omitting ``trusted``.
|
|
Do not automatically retry a refused load with unrestricted deserialization.
|
|
|
|
Workflows that resume training can configure ``DelayTrainerR`` or
|
|
``DelayTrainerRM`` with ``trusted=True`` at construction, rather than
|
|
changing internal loads. See :ref:`artifact_loading_migration` for migration details,
|
|
version limitations and the separate trust requirements of local pickle files.
|
|
|
|
|
|
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>`_.
|
|
|
|
See :ref:`config_migration` when upgrading file-based models: each ``.py``
|
|
component needs its own top-level boolean ``trusted`` declaration, while
|
|
package imports remain available. The guide also covers trusted older
|
|
file-model pickles and registering custom built-in TRA backbones through
|
|
``qlib.contrib.model.pytorch_tra.MODEL_TYPES`` before construction, including
|
|
in workers.
|
|
|
|
|
|
API
|
|
===
|
|
Please refer to `Model API <../reference/api.html#module-qlib.model.base>`_.
|