1
0
mirror of https://github.com/microsoft/qlib.git synced 2026-07-17 17:34:35 +08:00

fix naming and code style

This commit is contained in:
Alex Wang
2021-03-24 15:47:26 +08:00
parent 3bf6c7f95f
commit e3739bb980
4 changed files with 27 additions and 16 deletions

View File

@@ -32,7 +32,7 @@ data_handler_config: &data_handler_config
task: task:
model: model:
class: "HF_LGBModel" class: "HFLGBModel"
module_path: "qlib.contrib.model.highfreq_gdbt_model" module_path: "qlib.contrib.model.highfreq_gdbt_model"
kwargs: kwargs:
objective: 'binary' objective: 'binary'

View File

@@ -8,12 +8,23 @@ import pandas as pd
from typing import Tuple from typing import Tuple
def calc_prec( def calc_long_short_prec(
pred: pd.Series, label: pd.Series, date_col="datetime", quantile: float = 0.2, dropna=False, is_alpha=False pred: pd.Series, label: pd.Series, date_col="datetime", quantile: float = 0.2, dropna=False, is_alpha=False
) -> Tuple[pd.Series, pd.Series]: ) -> Tuple[pd.Series, pd.Series]:
"""calculate the precision """
pred : calculate the precision for long and short operation
pred
:param pred/label: index is **pd.MultiIndex**, index name is **[datetime, instruments]**; columns names is **[score]**.
.. code-block:: python
score
datetime instrument
2020-12-01 09:30:00 SH600068 0.553634
SH600195 0.550017
SH600276 0.540321
SH600584 0.517297
SH600715 0.544674
label : label :
label label
date_col : date_col :
@@ -25,7 +36,7 @@ def calc_prec(
long precision and short precision in time level long precision and short precision in time level
""" """
if is_alpha: if is_alpha:
label = label - label.mean(level=0) label = label - label.mean(level=date_col)
if int(1 / quantile) >= len(label.index.get_level_values(1).unique()): if int(1 / quantile) >= len(label.index.get_level_values(1).unique()):
raise ValueError("Need more instruments to calculate precision") raise ValueError("Need more instruments to calculate precision")
@@ -41,13 +52,13 @@ def calc_prec(
short = group.apply(lambda x: x.nsmallest(N(x), columns="pred").label).reset_index(level=0, drop=True) short = group.apply(lambda x: x.nsmallest(N(x), columns="pred").label).reset_index(level=0, drop=True)
groupll = long.groupby(date_col) groupll = long.groupby(date_col)
ll_ration = groupll.apply(lambda x: x > 0) l_dom = groupll.apply(lambda x: x > 0)
ll_c = groupll.count() l_c = groupll.count()
groups = short.groupby(date_col) groups = short.groupby(date_col)
s_ration = groups.apply(lambda x: x < 0) s_dom = groups.apply(lambda x: x < 0)
s_c = groups.count() s_c = groups.count()
return (ll_ration.groupby(date_col).sum() / ll_c), (s_ration.groupby(date_col).sum() / s_c) return (l_dom.groupby(date_col).sum() / l_c), (s_dom.groupby(date_col).sum() / s_c)
def calc_ic(pred: pd.Series, label: pd.Series, date_col="datetime", dropna=False) -> Tuple[pd.Series, pd.Series]: def calc_ic(pred: pd.Series, label: pd.Series, date_col="datetime", dropna=False) -> Tuple[pd.Series, pd.Series]:

View File

@@ -11,8 +11,8 @@ from qlib.data.dataset.handler import DataHandlerLP
import warnings import warnings
class HF_LGBModel(ModelFT): class HFLGBModel(ModelFT):
"""LightGBM Model""" """LightGBM Model for high frequency prediction"""
def __init__(self, loss="mse", **kwargs): def __init__(self, loss="mse", **kwargs):
if loss not in {"mse", "binary"}: if loss not in {"mse", "binary"}:

View File

@@ -13,7 +13,7 @@ from ..data.dataset.handler import DataHandlerLP
from ..utils import init_instance_by_config, get_module_by_module_path from ..utils import init_instance_by_config, get_module_by_module_path
from ..log import get_module_logger from ..log import get_module_logger
from ..utils import flatten_dict from ..utils import flatten_dict
from ..contrib.eva.alpha import calc_ic, calc_long_short_return, calc_prec from ..contrib.eva.alpha import calc_ic, calc_long_short_return, calc_long_short_prec
from ..contrib.strategy.strategy import BaseStrategy from ..contrib.strategy.strategy import BaseStrategy
logger = get_module_logger("workflow", "INFO") logger = get_module_logger("workflow", "INFO")
@@ -169,8 +169,7 @@ class HFSignalRecord(SignalRecord):
def generate(self): def generate(self):
pred = self.load("pred.pkl") pred = self.load("pred.pkl")
raw_label = self.load("label.pkl") raw_label = self.load("label.pkl")
long_pre, short_pre = calc_long_short_prec(pred.iloc[:, 0], raw_label.iloc[:, 0], is_alpha=True)
long_pre, short_pre = calc_prec(pred.iloc[:, 0], raw_label.iloc[:, 0], is_alpha=True)
ic, ric = calc_ic(pred.iloc[:, 0], raw_label.iloc[:, 0]) ic, ric = calc_ic(pred.iloc[:, 0], raw_label.iloc[:, 0])
metrics = { metrics = {
"IC": ic.mean(), "IC": ic.mean(),
@@ -205,8 +204,9 @@ class HFSignalRecord(SignalRecord):
self.get_path("ric.pkl"), self.get_path("ric.pkl"),
self.get_path("long_pre.pkl"), self.get_path("long_pre.pkl"),
self.get_path("short_pre.pkl"), self.get_path("short_pre.pkl"),
self.get_path("long_short_r.pkl"),
self.get_path("long_avg_r.pkl"),
] ]
paths.extend([self.get_path("long_short_r.pkl"), self.get_path("long_avg_r.pkl")])
return paths return paths