mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-19 10:24:35 +08:00
get_base_info
This commit is contained in:
committed by
you-n-g
parent
f7d7f1a223
commit
16b954866f
@@ -16,7 +16,7 @@ from qlib.backtest.exchange import Exchange
|
||||
from qlib.backtest.order import BaseTradeDecision, Order, OrderDir
|
||||
from qlib.backtest.utils import TradeCalendarManager
|
||||
|
||||
from .high_performance_ds import PandasOrderIndicator, NumpyOrderIndicator
|
||||
from .high_performance_ds import PandasOrderIndicator, NumpyOrderIndicator, IndexData
|
||||
from ..data import D
|
||||
from ..tests.config import CSI300_BENCH
|
||||
from ..utils.resam import get_higher_eq_freq_feature, resam_ts_data
|
||||
@@ -391,23 +391,26 @@ class Indicator:
|
||||
return None, None
|
||||
|
||||
if isinstance(price_s, (int, float)):
|
||||
price_s = pd.Series(price_s, index=[trade_start_time])
|
||||
price_s = IndexData([price_s], [inst], [trade_start_time])
|
||||
|
||||
# NOTE: there are some zeros in the trading price. These cases are known meaningless
|
||||
# for aligning the previous logic, remove it.
|
||||
price_s = price_s[~(price_s < 1e-08)] # remove zero and negative values.
|
||||
# remove zero and negative values.
|
||||
price_s = price_s.keep_positive(1e-08)
|
||||
# NOTE ~(price_s < 1e-08) is different from price_s >= 1e-8
|
||||
|
||||
if agg == "vwap":
|
||||
volume_s = trade_exchange.get_volume(inst, trade_start_time, trade_end_time, method=None)
|
||||
volume_s = volume_s.reindex(price_s.index)
|
||||
if isinstance(volume_s, (int, float)):
|
||||
volume_s = IndexData([volume_s], [inst], [trade_start_time])
|
||||
volume_s = volume_s.reindex(price_s.col)
|
||||
elif agg == "twap":
|
||||
volume_s = pd.Series(1, index=price_s.index)
|
||||
volume_s = IndexData([1 for i in range(price_s.col)], [inst], price_s.col)
|
||||
else:
|
||||
raise NotImplementedError(f"This type of input is not supported")
|
||||
|
||||
base_volume = volume_s.sum().item()
|
||||
base_price = ((price_s * volume_s).sum() / base_volume).item()
|
||||
base_volume = volume_s.sum()
|
||||
base_price = (price_s * volume_s).sum() / base_volume
|
||||
|
||||
return base_price, base_volume
|
||||
|
||||
@@ -441,15 +444,15 @@ class Indicator:
|
||||
"""
|
||||
|
||||
# TODO: I think there are potentials to be optimized
|
||||
trade_dir = self.order_indicator.get_metric_series("trade_dir")
|
||||
trade_dir = self.order_indicator.get_index_data("trade_dir")
|
||||
if len(trade_dir) > 0:
|
||||
bp_all, bv_all = [], []
|
||||
# <step, inst, (base_volume | base_price)>
|
||||
for oi, (dec, start, end) in zip(inner_order_indicators, decision_list):
|
||||
bp_s = oi.get_metric_series("base_price").reindex(trade_dir.index)
|
||||
bv_s = oi.get_metric_series("base_volume").reindex(trade_dir.index)
|
||||
bp_s = oi.get_index_data("base_price").reindex(trade_dir.col)
|
||||
bv_s = oi.get_index_data("base_volume").reindex(trade_dir.col)
|
||||
bp_new, bv_new = {}, {}
|
||||
for pr, v, (inst, direction) in zip(bp_s.values, bv_s.values, trade_dir.items()):
|
||||
for pr, v, (inst, direction) in zip(bp_s.data, bv_s.data, zip(trade_dir.col, trade_dir.data)):
|
||||
if np.isnan(pr):
|
||||
bp_tmp, bv_tmp = self._get_base_vol_pri(
|
||||
inst,
|
||||
@@ -465,15 +468,16 @@ class Indicator:
|
||||
else:
|
||||
bp_new[inst], bv_new[inst] = pr, v
|
||||
|
||||
bp_new, bv_new = pd.Series(bp_new), pd.Series(bv_new)
|
||||
bp_new = IndexData(list(bp_new.values()), ["base_price"], list(bp_new.keys()))
|
||||
bv_new = IndexData(list(bv_new.values()), ["base_volume"], list(bv_new.keys()))
|
||||
bp_all.append(bp_new)
|
||||
bv_all.append(bv_new)
|
||||
bp_all = pd.concat(bp_all, axis=1)
|
||||
bv_all = pd.concat(bv_all, axis=1)
|
||||
bp_all = IndexData.concat_by_col(bp_all)
|
||||
bv_all = IndexData.concat_by_col(bv_all)
|
||||
|
||||
base_volume = bv_all.sum(axis=1)
|
||||
self.order_indicator.assign("base_volume", base_volume)
|
||||
self.order_indicator.assign("base_price", (bp_all * bv_all).sum(axis=1) / base_volume)
|
||||
base_volume = bv_all.sum(axis = 0)
|
||||
self.order_indicator.assign("base_volume", base_volume.to_dict())
|
||||
self.order_indicator.assign("base_price", ((bp_all * bv_all).sum(axis = 0) / base_volume).to_dict())
|
||||
|
||||
def _agg_order_price_advantage(self):
|
||||
def if_empty_func(trade_price):
|
||||
@@ -592,7 +596,7 @@ class Indicator:
|
||||
)
|
||||
)
|
||||
|
||||
def get_order_indicator(self, raw: bool = False):
|
||||
def get_order_indicator(self, raw: bool = True):
|
||||
if raw:
|
||||
return self.order_indicator
|
||||
return self.order_indicator.to_series()
|
||||
|
||||
Reference in New Issue
Block a user