diff --git a/README.md b/README.md index 48873ed2e..d796573a4 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ We recommend users to prepare their own data if they have a high-quality dataset ```python import qlib from qlib.data import D - from qlib.config import REG_CN + from qlib.constant import REG_CN # Initialization mount_path = "~/.qlib/qlib_data/cn_data" # target_dir diff --git a/docs/component/data.rst b/docs/component/data.rst index b7b457d0b..b4e7d40bd 100644 --- a/docs/component/data.rst +++ b/docs/component/data.rst @@ -219,7 +219,7 @@ The `trade unit` defines the unit number of stocks can be used in a trade, and t .. code-block:: python - from qlib.config import REG_CN + from qlib.constant import REG_CN qlib.init(provider_uri='~/.qlib/qlib_data/cn_data', region=REG_CN) diff --git a/docs/start/initialization.rst b/docs/start/initialization.rst index 08062ac18..5b7e1c3f7 100644 --- a/docs/start/initialization.rst +++ b/docs/start/initialization.rst @@ -27,7 +27,7 @@ Initialize Qlib before calling other APIs: run following code in python. import qlib # region in [REG_CN, REG_US] - from qlib.config import REG_CN + from qlib.constant import REG_CN provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir qlib.init(provider_uri=provider_uri, region=REG_CN) @@ -42,10 +42,10 @@ Besides `provider_uri` and `region`, `qlib.init` has other parameters. The follo - `provider_uri` Type: str. The URI of the Qlib data. For example, it could be the location where the data loaded by ``get_data.py`` are 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. + Type: str, optional parameter(default: `qlib.constant.REG_CN`). + Currently: ``qlib.constant.REG_US`` ('us') and ``qlib.constant.REG_CN`` ('cn') is supported. Different value of `region` will result in different stock market mode. + - ``qlib.constant.REG_US``: US stock market. + - ``qlib.constant.REG_CN``: China stock market. Different modes will result in different trading limitations and costs. The region is just `shortcuts for defining a batch of configurations `_. Users can set the key configurations manually if the existing region setting can't meet their requirements. diff --git a/examples/highfreq/highfreq_processor.py b/examples/highfreq/highfreq_processor.py index 62065469b..26e0fdd0f 100644 --- a/examples/highfreq/highfreq_processor.py +++ b/examples/highfreq/highfreq_processor.py @@ -1,5 +1,6 @@ import numpy as np import pandas as pd +from qlib.constant import EPS from qlib.data.dataset.processor import Processor from qlib.data.dataset.utils import fetch_df_by_index @@ -27,7 +28,7 @@ class HighFreqNorm(Processor): part_values = np.log1p(part_values) self.feature_med[name] = np.nanmedian(part_values) part_values = part_values - self.feature_med[name] - self.feature_std[name] = np.nanmedian(np.absolute(part_values)) * 1.4826 + 1e-12 + self.feature_std[name] = np.nanmedian(np.absolute(part_values)) * 1.4826 + EPS part_values = part_values / self.feature_std[name] self.feature_vmax[name] = np.nanmax(part_values) self.feature_vmin[name] = np.nanmin(part_values) diff --git a/examples/highfreq/workflow.py b/examples/highfreq/workflow.py index dc91f9b25..c631d72e7 100644 --- a/examples/highfreq/workflow.py +++ b/examples/highfreq/workflow.py @@ -5,7 +5,8 @@ import fire import qlib import pickle -from qlib.config import REG_CN, HIGH_FREQ_CONFIG +from qlib.constant import REG_CN +from qlib.config import HIGH_FREQ_CONFIG from qlib.utils import init_instance_by_config from qlib.data.dataset.handler import DataHandlerLP diff --git a/examples/hyperparameter/LightGBM/hyperparameter_158.py b/examples/hyperparameter/LightGBM/hyperparameter_158.py index 89cc10cc6..8c3e9f3e8 100644 --- a/examples/hyperparameter/LightGBM/hyperparameter_158.py +++ b/examples/hyperparameter/LightGBM/hyperparameter_158.py @@ -1,6 +1,6 @@ import qlib import optuna -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.utils import init_instance_by_config from qlib.tests.config import CSI300_DATASET_CONFIG from qlib.tests.data import GetData diff --git a/examples/hyperparameter/LightGBM/hyperparameter_360.py b/examples/hyperparameter/LightGBM/hyperparameter_360.py index bc0cc245d..322c0fa42 100644 --- a/examples/hyperparameter/LightGBM/hyperparameter_360.py +++ b/examples/hyperparameter/LightGBM/hyperparameter_360.py @@ -1,6 +1,6 @@ import qlib import optuna -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.utils import init_instance_by_config from qlib.tests.data import GetData from qlib.tests.config import get_dataset_config, CSI300_MARKET, DATASET_ALPHA360_CLASS diff --git a/examples/model_interpreter/feature.py b/examples/model_interpreter/feature.py index a1288e07d..bfc58fc84 100644 --- a/examples/model_interpreter/feature.py +++ b/examples/model_interpreter/feature.py @@ -3,7 +3,7 @@ import qlib -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.utils import init_instance_by_config from qlib.tests.data import GetData diff --git a/examples/model_rolling/task_manager_rolling.py b/examples/model_rolling/task_manager_rolling.py index 9db798101..2fb7c85b5 100644 --- a/examples/model_rolling/task_manager_rolling.py +++ b/examples/model_rolling/task_manager_rolling.py @@ -11,7 +11,7 @@ from pprint import pprint import fire import qlib -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.workflow import R from qlib.workflow.task.gen import RollingGen, task_generator from qlib.workflow.task.manage import TaskManager, run_task diff --git a/examples/nested_decision_execution/workflow.py b/examples/nested_decision_execution/workflow.py index 18d33a32c..24af42123 100644 --- a/examples/nested_decision_execution/workflow.py +++ b/examples/nested_decision_execution/workflow.py @@ -100,7 +100,8 @@ from copy import deepcopy import qlib import fire import pandas as pd -from qlib.config import REG_CN, HIGH_FREQ_CONFIG +from qlib.constant import REG_CN +from qlib.config import HIGH_FREQ_CONFIG from qlib.data import D from qlib.utils import exists_qlib_data, init_instance_by_config, flatten_dict from qlib.workflow import R diff --git a/examples/online_srv/update_online_pred.py b/examples/online_srv/update_online_pred.py index 8afc66553..faeec24da 100644 --- a/examples/online_srv/update_online_pred.py +++ b/examples/online_srv/update_online_pred.py @@ -10,7 +10,7 @@ Next, we will finish updating online predictions. import copy import fire import qlib -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.model.trainer import task_train from qlib.workflow.online.utils import OnlineToolR from qlib.tests.config import CSI300_GBDT_TASK diff --git a/examples/rolling_process_data/workflow.py b/examples/rolling_process_data/workflow.py index 12579175f..434d365e5 100644 --- a/examples/rolling_process_data/workflow.py +++ b/examples/rolling_process_data/workflow.py @@ -6,7 +6,7 @@ import fire import pickle from datetime import datetime -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.data.dataset.handler import DataHandlerLP from qlib.utils import init_instance_by_config from qlib.tests.data import GetData diff --git a/examples/run_all_model.py b/examples/run_all_model.py index b6ce4d64a..4451cafaa 100644 --- a/examples/run_all_model.py +++ b/examples/run_all_model.py @@ -20,7 +20,6 @@ from operator import xor from pprint import pprint import qlib -from qlib.config import REG_CN from qlib.workflow import R from qlib.tests.data import GetData diff --git a/examples/workflow_by_code.ipynb b/examples/workflow_by_code.ipynb index c32884e11..3d4866930 100644 --- a/examples/workflow_by_code.ipynb +++ b/examples/workflow_by_code.ipynb @@ -61,7 +61,7 @@ "\n", "import qlib\n", "import pandas as pd\n", - "from qlib.config import REG_CN\n", + "from qlib.constant import REG_CN\n", "from qlib.utils import exists_qlib_data, init_instance_by_config\n", "from qlib.workflow import R\n", "from qlib.workflow.record_temp import SignalRecord, PortAnaRecord\n", diff --git a/examples/workflow_by_code.py b/examples/workflow_by_code.py index 67b2d26cf..da933b54e 100644 --- a/examples/workflow_by_code.py +++ b/examples/workflow_by_code.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. import qlib -from qlib.config import REG_CN +from qlib.constant import REG_CN from qlib.utils import init_instance_by_config, flatten_dict from qlib.workflow import R from qlib.workflow.record_temp import SignalRecord, PortAnaRecord, SigAnaRecord diff --git a/qlib/backtest/exchange.py b/qlib/backtest/exchange.py index f09cce2c1..dce1e80a8 100644 --- a/qlib/backtest/exchange.py +++ b/qlib/backtest/exchange.py @@ -14,7 +14,8 @@ import numpy as np import pandas as pd from ..data.data import D -from ..config import C, REG_CN +from ..config import C +from ..constant import REG_CN from ..log import get_module_logger from .decision import Order, OrderDir, OrderHelper from .high_performance_ds import BaseQuote, PandasQuote, NumpyQuote diff --git a/qlib/config.py b/qlib/config.py index 2459e916c..d9a2dd07f 100644 --- a/qlib/config.py +++ b/qlib/config.py @@ -22,6 +22,8 @@ from pathlib import Path from typing import Optional, Union from typing import TYPE_CHECKING +from qlib.constant import REG_CN, REG_US + if TYPE_CHECKING: from qlib.utils.time import Freq @@ -74,10 +76,6 @@ class Config: self.update(**config_c.__dict__["_config"]) -# REGION CONST -REG_CN = "cn" -REG_US = "us" - # pickle.dump protocol version: https://docs.python.org/3/library/pickle.html#data-stream-format PROTOCOL_VERSION = 4 diff --git a/qlib/constant.py b/qlib/constant.py new file mode 100644 index 000000000..c3ad11dbf --- /dev/null +++ b/qlib/constant.py @@ -0,0 +1,9 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# REGION CONST +REG_CN = "cn" +REG_US = "us" + +# Epsilon for avoiding division by zero. +EPS = 1e-12 diff --git a/qlib/contrib/model/pytorch_tra.py b/qlib/contrib/model/pytorch_tra.py index 1318c19c1..423474c1f 100644 --- a/qlib/contrib/model/pytorch_tra.py +++ b/qlib/contrib/model/pytorch_tra.py @@ -25,6 +25,7 @@ except: from tqdm import tqdm from qlib.utils import get_or_create_path +from qlib.constant import EPS from qlib.log import get_module_logger from qlib.model.base import Model from qlib.contrib.data.dataset import MTSDatasetH @@ -791,7 +792,7 @@ def minmax_norm(x): xmin = x.min(dim=-1, keepdim=True).values xmax = x.max(dim=-1, keepdim=True).values mask = (xmin == xmax).squeeze() - x = (x - xmin) / (xmax - xmin + 1e-12) + x = (x - xmin) / (xmax - xmin + EPS) x[mask] = 1 return x diff --git a/qlib/data/dataset/processor.py b/qlib/data/dataset/processor.py index 7294a9c4d..1c8c0f670 100644 --- a/qlib/data/dataset/processor.py +++ b/qlib/data/dataset/processor.py @@ -5,15 +5,12 @@ import abc from typing import Union, Text import numpy as np import pandas as pd -import copy -from ...log import TimeInspector +from ...constant import EPS from .utils import fetch_df_by_index from ...utils.serial import Serializable from ...utils.paral import datetime_groupby_apply -EPS = 1e-12 - def get_group_columns(df: pd.DataFrame, group: Union[Text, None]): """ diff --git a/qlib/tests/__init__.py b/qlib/tests/__init__.py index 549c0e752..f736dbd7d 100644 --- a/qlib/tests/__init__.py +++ b/qlib/tests/__init__.py @@ -1,7 +1,7 @@ import unittest from .data import GetData from .. import init -from ..config import REG_CN +from ..constant import REG_CN class TestAutoData(unittest.TestCase): diff --git a/scripts/README.md b/scripts/README.md index 562ac77e2..171d7bf05 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -62,7 +62,8 @@ qlib.init(provider_uri=provider_uri, region=REG_US) ```python import qlib -from qlib.config import REG_CN +from qlib.constant import REG_CN + provider_uri = "~/.qlib/qlib_data/cn_data" # target_dir qlib.init(provider_uri=provider_uri, region=REG_CN) ``` diff --git a/scripts/data_collector/fund/collector.py b/scripts/data_collector/fund/collector.py index ad504b4e0..18942893b 100644 --- a/scripts/data_collector/fund/collector.py +++ b/scripts/data_collector/fund/collector.py @@ -13,7 +13,7 @@ import requests import pandas as pd from loguru import logger from dateutil.tz import tzlocal -from qlib.config import REG_CN as REGION_CN +from qlib.constant import REG_CN as REGION_CN CUR_DIR = Path(__file__).resolve().parent sys.path.append(str(CUR_DIR.parent.parent)) diff --git a/scripts/data_collector/yahoo/collector.py b/scripts/data_collector/yahoo/collector.py index 594661b40..55141c94e 100644 --- a/scripts/data_collector/yahoo/collector.py +++ b/scripts/data_collector/yahoo/collector.py @@ -22,7 +22,7 @@ from dateutil.tz import tzlocal from qlib.tests.data import GetData from qlib.utils import code_to_fname, fname_to_code, exists_qlib_data -from qlib.config import REG_CN as REGION_CN +from qlib.constant import REG_CN as REGION_CN CUR_DIR = Path(__file__).resolve().parent sys.path.append(str(CUR_DIR.parent.parent)) diff --git a/tests/backtest/test_high_freq_trading.py b/tests/backtest/test_high_freq_trading.py index 550bddac3..21bc4e0d4 100644 --- a/tests/backtest/test_high_freq_trading.py +++ b/tests/backtest/test_high_freq_trading.py @@ -5,7 +5,6 @@ from qlib.backtest.decision import BaseTradeDecision, TradeRangeByTime import qlib from qlib.tests import TestAutoData import unittest -from qlib.config import REG_CN, HIGH_FREQ_CONFIG import pandas as pd diff --git a/tests/rolling_tests/test_update_pred.py b/tests/rolling_tests/test_update_pred.py index f3a295d31..275c1d419 100644 --- a/tests/rolling_tests/test_update_pred.py +++ b/tests/rolling_tests/test_update_pred.py @@ -5,7 +5,6 @@ import fire import pandas as pd import qlib -from qlib.config import REG_CN from qlib.data import D from qlib.model.trainer import task_train from qlib.tests import TestAutoData