mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-01 10:01:19 +08:00
220 lines
8.0 KiB
Python
220 lines
8.0 KiB
Python
from qlib.data.dataset.handler import DataHandler, DataHandlerLP
|
|
from qlib.data.dataset.processor import Processor
|
|
from qlib.utils import get_cls_kwargs
|
|
from qlib.log import TimeInspector
|
|
|
|
|
|
class HighFreqHandler(DataHandlerLP):
|
|
def __init__(
|
|
self,
|
|
instruments="csi500",
|
|
start_time=None,
|
|
end_time=None,
|
|
freq="1min",
|
|
infer_processors=[],
|
|
learn_processors=[],
|
|
fit_start_time=None,
|
|
fit_end_time=None,
|
|
drop_raw=True,
|
|
):
|
|
def check_transform_proc(proc_l):
|
|
new_l = []
|
|
for p in proc_l:
|
|
p["kwargs"].update(
|
|
{
|
|
"fit_start_time": fit_start_time,
|
|
"fit_end_time": fit_end_time,
|
|
}
|
|
)
|
|
new_l.append(p)
|
|
return new_l
|
|
|
|
infer_processors = check_transform_proc(infer_processors)
|
|
learn_processors = check_transform_proc(learn_processors)
|
|
|
|
data_loader = {
|
|
"class": "QlibDataLoader",
|
|
"kwargs": {
|
|
"config": self.get_feature_config(),
|
|
"swap_level": False,
|
|
},
|
|
}
|
|
super().__init__(
|
|
instruments=instruments,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
freq=freq,
|
|
data_loader=data_loader,
|
|
infer_processors=infer_processors,
|
|
learn_processors=learn_processors,
|
|
drop_raw=drop_raw,
|
|
)
|
|
|
|
def get_feature_config(self):
|
|
fields = []
|
|
names = []
|
|
|
|
template_if = "If(IsNull({1}), {0}, {1})"
|
|
template_paused = "Select(Eq($paused, 0.0), {0})"
|
|
template_fillnan = "FFillNan({0})"
|
|
fields += [
|
|
"{0}/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$open"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += [
|
|
"{0}/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$high"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += [
|
|
"{0}/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$low"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += ["{0}/Ref(DayLast({0}), 240)".format(template_fillnan.format(template_paused.format("$close")))]
|
|
fields += [
|
|
"{0}/Ref(DayLast({1}), 240)".format(
|
|
"If(IsNull({1}), {0}, If(Or(Or(Or(Eq({1}, np.inf), Eq({1}, -np.inf)), Eq({1}, 0)), Or(Gt({1}, Mul(1.001, {3})), Lt({1}, Mul(0.999, {2})))), {0}, {1}))".format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$vwap"),
|
|
template_paused.format("$low"),
|
|
template_paused.format("$high"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
names += ["$open", "$high", "$low", "$close", "$vwap"]
|
|
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$open"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$high"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast({1}), 240)".format(
|
|
template_if.format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$low"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast({0}), 240)".format(template_fillnan.format(template_paused.format("$close")))
|
|
]
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast({1}), 240)".format(
|
|
"If(IsNull({1}), {0}, If(Or(Or(Or(Eq({1}, np.inf), Eq({1}, -np.inf)), Eq({1}, 0)), Or(Gt({1}, Mul(1.001, {3})), Lt({1}, Mul(0.999, {2})))), {0}, {1}))".format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$vwap"),
|
|
template_paused.format("$low"),
|
|
template_paused.format("$high"),
|
|
),
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
)
|
|
]
|
|
names += ["$open_1", "$high_1", "$low_1", "$close_1", "$vwap_1"]
|
|
|
|
fields += [
|
|
"{0}/Ref(DayLast(Mean({0}, 7200)), 240)".format(
|
|
"If(IsNull({1}), 0, If(Or(Gt({2}, Mul(1.001, {4})), Lt({2}, Mul(0.999, {3}))), 0, {1}))".format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$volume"),
|
|
template_paused.format("$vwap"),
|
|
template_paused.format("$low"),
|
|
template_paused.format("$high"),
|
|
)
|
|
)
|
|
]
|
|
names += ["$volume"]
|
|
fields += [
|
|
"Ref({0}, 240)/Ref(DayLast(Mean({0}, 7200)), 240)".format(
|
|
"If(IsNull({1}), 0, If(Or(Gt({2}, Mul(1.001, {4})), Lt({2}, Mul(0.999, {3}))), 0, {1}))".format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$volume"),
|
|
template_paused.format("$vwap"),
|
|
template_paused.format("$low"),
|
|
template_paused.format("$high"),
|
|
)
|
|
)
|
|
]
|
|
names += ["$volume_1"]
|
|
|
|
fields += [template_paused.format("Date($close)")]
|
|
names += ["date"]
|
|
return fields, names
|
|
|
|
|
|
class HighFreqBacktestHandler(DataHandler):
|
|
def __init__(
|
|
self,
|
|
instruments="csi300",
|
|
start_time=None,
|
|
end_time=None,
|
|
freq="1min",
|
|
):
|
|
data_loader = {
|
|
"class": "QlibDataLoader",
|
|
"kwargs": {
|
|
"config": self.get_feature_config(),
|
|
"swap_level": False,
|
|
},
|
|
}
|
|
super().__init__(
|
|
instruments=instruments,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
freq=freq,
|
|
data_loader=data_loader,
|
|
)
|
|
|
|
def get_feature_config(self):
|
|
fields = []
|
|
names = []
|
|
|
|
template_if = "If(Eq({1}, np.nan), {0}, {1})"
|
|
template_paused = "Select(Eq($paused, 0.0), {0})"
|
|
template_fillnan = "FFillNan({0})"
|
|
|
|
fields += [
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
]
|
|
names += ["$vwap0"]
|
|
fields += [
|
|
"If(Eq({1}, np.nan), 0, If(Or(Gt({2}, Mul(1.001, {4})), Lt({2}, Mul(0.999, {3}))), 0, {1}))".format(
|
|
template_fillnan.format(template_paused.format("$close")),
|
|
template_paused.format("$volume"),
|
|
template_paused.format("$vwap"),
|
|
template_paused.format("$low"),
|
|
template_paused.format("$high"),
|
|
)
|
|
]
|
|
names += ["$volume0"]
|
|
return fields, names
|