1
0
mirror of https://github.com/microsoft/qlib.git synced 2026-07-04 11:30:57 +08:00

fix indicator

This commit is contained in:
wangwenxi.handsome
2021-07-27 09:06:13 +00:00
parent fcca242807
commit 66971d5f0d
2 changed files with 29 additions and 9 deletions

View File

@@ -172,15 +172,25 @@ class BaseSingleMetric:
@property
def empty(self) -> bool:
"""If metric is empyt, return True."""
raise NotImplementedError(f"Please implement the `empty` method")
def add(self, other: "BaseSingleMetric", fill_value: float = None) -> "BaseSingleMetric":
"""Replace np.NaN with fill_value in two metrics and add them."""
raise NotImplementedError(f"Please implement the `add` method")
def map(self, map_dict: dict) -> "BaseSingleMetric":
"""Replace the value of metric according to map_dict."""
raise NotImplementedError(f"Please implement the `map` method")
def replace(self, replace_dict: dict) -> "BaseSingleMetric":
"""Replace the value of metric according to replace_dict."""
raise NotImplementedError(f"Please implement the `replace` method")
def apply(self, func: dict) -> "BaseSingleMetric":
"""Replace the value of metric with func(metric).
Currently, the func is only qlib/backtest/order/Order.parse_dir.
"""
raise NotImplementedError(f"Please implement the 'apply' method")
class BaseOrderIndicator:
@@ -371,8 +381,11 @@ class PandasSingleMetric:
def add(self, other, fill_value=None):
return PandasSingleMetric(self.metric.add(other.metric, fill_value=fill_value))
def map(self, map_dict: dict):
return PandasSingleMetric(self.metric.apply(map_dict))
def replace(self, replace_dict: dict):
return PandasSingleMetric(self.metric.replace(replace_dict))
def apply(self, func: Callable):
return PandasSingleMetric(self.metric.apply(func))
class PandasOrderIndicator(BaseOrderIndicator):
@@ -413,6 +426,11 @@ class PandasOrderIndicator(BaseOrderIndicator):
for metric in metrics:
tmp_metric = PandasSingleMetric({})
for indicator in indicators:
tmp_metric = tmp_metric.add(indicator.data[metric], fill_value)
if(metric == "trade_price"):
tmp_metric = tmp_metric.add(
indicator.data["trade_price"] * indicator.data["deal_amount"], fill_value
)
else:
tmp_metric = tmp_metric.add(indicator.data[metric], fill_value)
metric_dict[metric] = tmp_metric.metric
return metric_dict

View File

@@ -308,7 +308,8 @@ class Indicator:
def _update_order_fulfill_rate(self):
def func(deal_amount, amount):
return deal_amount / amount
tmp_deal_amount = deal_amount.replace({np.NaN: 0})
return deal_amount / tmp_deal_amount
self.order_indicator.transfer(func, "ffr")
@@ -323,12 +324,13 @@ class Indicator:
self.order_indicator.assign(metric, metric_dict[metric])
def func(trade_price, deal_amount):
return trade_price / deal_amount
tmp_deal_amount = deal_amount.replace({0: np.NaN})
return trade_price / tmp_deal_amount
self.order_indicator.transfer(func, "trade_price")
def func_apply(trade_dir):
return trade_dir.map(Order.parse_dir)
return trade_dir.apply(Order.parse_dir)
self.order_indicator.transfer(func_apply, "trade_dir")