mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-16 17:12:20 +08:00
Merge branch 'nested_decision_exe' of github.com:microsoft/qlib into nested_decision_exe
This commit is contained in:
@@ -128,8 +128,8 @@ class OrderHelper:
|
|||||||
code: str,
|
code: str,
|
||||||
amount: float,
|
amount: float,
|
||||||
direction: OrderDir,
|
direction: OrderDir,
|
||||||
start_time: Union[str, pd.Timestamp]=None,
|
start_time: Union[str, pd.Timestamp] = None,
|
||||||
end_time: Union[str, pd.Timestamp]=None,
|
end_time: Union[str, pd.Timestamp] = None,
|
||||||
) -> Order:
|
) -> Order:
|
||||||
"""
|
"""
|
||||||
help to create a order
|
help to create a order
|
||||||
@@ -410,7 +410,7 @@ class BaseTradeDecision:
|
|||||||
_start_idx, _end_idx = max(0, _start_idx), min(self.total_step - 1, _end_idx)
|
_start_idx, _end_idx = max(0, _start_idx), min(self.total_step - 1, _end_idx)
|
||||||
return _start_idx, _end_idx
|
return _start_idx, _end_idx
|
||||||
|
|
||||||
def get_data_cal_range_limit(self, rtype: str="full", raise_error: bool = False) -> Tuple[int, int]:
|
def get_data_cal_range_limit(self, rtype: str = "full", raise_error: bool = False) -> Tuple[int, int]:
|
||||||
"""
|
"""
|
||||||
get the range limit based on data calendar
|
get the range limit based on data calendar
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class TradeCalendarManager:
|
|||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
trade_step : int, optional
|
trade_step : int, optional
|
||||||
the number of trading step finished, by default None to indicate
|
the number of trading step finished, by default None to indicate current step
|
||||||
shift : int, optional
|
shift : int, optional
|
||||||
shift bars , by default 0
|
shift bars , by default 0
|
||||||
|
|
||||||
@@ -239,8 +239,9 @@ class LevelInfrastructure(BaseInfrastructure):
|
|||||||
if self.has("trade_calendar"):
|
if self.has("trade_calendar"):
|
||||||
self.get("trade_calendar").reset(freq, start_time=start_time, end_time=end_time)
|
self.get("trade_calendar").reset(freq, start_time=start_time, end_time=end_time)
|
||||||
else:
|
else:
|
||||||
self.reset_infra(trade_calendar=TradeCalendarManager(freq, start_time=start_time, end_time=end_time,
|
self.reset_infra(
|
||||||
level_infra=self))
|
trade_calendar=TradeCalendarManager(freq, start_time=start_time, end_time=end_time, level_infra=self)
|
||||||
|
)
|
||||||
|
|
||||||
def set_sub_level_infra(self, sub_level_infra: LevelInfrastructure):
|
def set_sub_level_infra(self, sub_level_infra: LevelInfrastructure):
|
||||||
"""this will make the calendar access easier when acrossing multi-levels"""
|
"""this will make the calendar access easier when acrossing multi-levels"""
|
||||||
|
|||||||
@@ -313,7 +313,9 @@ class SBBStrategyEMA(SBBStrategyBase):
|
|||||||
if isinstance(instruments, str):
|
if isinstance(instruments, str):
|
||||||
self.instruments = D.instruments(instruments)
|
self.instruments = D.instruments(instruments)
|
||||||
self.freq = freq
|
self.freq = freq
|
||||||
super(SBBStrategyEMA, self).__init__(outer_trade_decision, level_infra, common_infra, trade_exchange=trade_exchange, **kwargs)
|
super(SBBStrategyEMA, self).__init__(
|
||||||
|
outer_trade_decision, level_infra, common_infra, trade_exchange=trade_exchange, **kwargs
|
||||||
|
)
|
||||||
|
|
||||||
def _reset_signal(self):
|
def _reset_signal(self):
|
||||||
trade_len = self.trade_calendar.get_trade_len()
|
trade_len = self.trade_calendar.get_trade_len()
|
||||||
@@ -396,11 +398,9 @@ class ACStrategy(BaseStrategy):
|
|||||||
if isinstance(instruments, str):
|
if isinstance(instruments, str):
|
||||||
self.instruments = D.instruments(instruments)
|
self.instruments = D.instruments(instruments)
|
||||||
self.freq = freq
|
self.freq = freq
|
||||||
super(ACStrategy, self).__init__(outer_trade_decision,
|
super(ACStrategy, self).__init__(
|
||||||
level_infra,
|
outer_trade_decision, level_infra, common_infra, trade_exchange=trade_exchange, **kwargs
|
||||||
common_infra,
|
)
|
||||||
trade_exchange=trade_exchange,
|
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
def _reset_signal(self):
|
def _reset_signal(self):
|
||||||
trade_len = self.trade_calendar.get_trade_len()
|
trade_len = self.trade_calendar.get_trade_len()
|
||||||
@@ -561,11 +561,14 @@ class RandomOrderStrategy(BaseStrategy):
|
|||||||
if step_time_start in self.volume_df:
|
if step_time_start in self.volume_df:
|
||||||
for stock_id, volume in self.volume_df[step_time_start].dropna().sample(frac=self.sample_ratio).items():
|
for stock_id, volume in self.volume_df[step_time_start].dropna().sample(frac=self.sample_ratio).items():
|
||||||
order_list.append(
|
order_list.append(
|
||||||
self.common_infra.get("trade_exchange").get_order_helper().create(
|
self.common_infra.get("trade_exchange")
|
||||||
|
.get_order_helper()
|
||||||
|
.create(
|
||||||
code=stock_id,
|
code=stock_id,
|
||||||
amount=volume * self.volume_ratio,
|
amount=volume * self.volume_ratio,
|
||||||
direction=self.direction,
|
direction=self.direction,
|
||||||
))
|
)
|
||||||
|
)
|
||||||
return TradeDecisionWO(order_list, self, self.trade_range)
|
return TradeDecisionWO(order_list, self, self.trade_range)
|
||||||
|
|
||||||
|
|
||||||
@@ -575,7 +578,9 @@ class FileOrderStrategy(BaseStrategy):
|
|||||||
- This class provides an interface for user to read orders from csv files.
|
- This class provides an interface for user to read orders from csv files.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, file: Union[IO, str, Path], trade_range: Union[Tuple[int, int], TradeRange]= None, *args, **kwargs):
|
def __init__(
|
||||||
|
self, file: Union[IO, str, Path], trade_range: Union[Tuple[int, int], TradeRange] = None, *args, **kwargs
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
|
|||||||
@@ -91,10 +91,9 @@ class BaseStrategy:
|
|||||||
1. Users want to initialize his strategy by overriding `reset`, but they don't want to affect the `_reset` called
|
1. Users want to initialize his strategy by overriding `reset`, but they don't want to affect the `_reset` called
|
||||||
when initialization
|
when initialization
|
||||||
"""
|
"""
|
||||||
self._reset(level_infra=level_infra,
|
self._reset(
|
||||||
common_infra=common_infra,
|
level_infra=level_infra, common_infra=common_infra, outer_trade_decision=outer_trade_decision, **kwargs
|
||||||
outer_trade_decision=outer_trade_decision,
|
)
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
def _reset(
|
def _reset(
|
||||||
self,
|
self,
|
||||||
@@ -114,7 +113,6 @@ class BaseStrategy:
|
|||||||
if outer_trade_decision is not None:
|
if outer_trade_decision is not None:
|
||||||
self.outer_trade_decision = outer_trade_decision
|
self.outer_trade_decision = outer_trade_decision
|
||||||
|
|
||||||
|
|
||||||
def generate_trade_decision(self, execute_result=None):
|
def generate_trade_decision(self, execute_result=None):
|
||||||
"""Generate trade decision in each trading bar
|
"""Generate trade decision in each trading bar
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user