def Dependency(self): Dependency = {} if self.Benchmark: Dependency["基准投资组合"] = True if self.TargetIDs: CompiledIDFilterStr, IDFilterFactors = testIDFilterStr(self.TargetIDs) if CompiledIDFilterStr is None: raise __QS_Error__("ID 过滤字符串有误!") Dependency["因子"] = IDFilterFactors return Dependency
def __QS_start__(self, mdl, dts, **kwargs): if self._isStarted: return () super().__QS_start__(mdl=mdl, dts=dts, **kwargs) self._Output = {} self._Output["正常收益率"] = np.zeros(shape=(0, self.EventPreWindow+1+self.EventPostWindow)) self._Output["异常收益率"] = np.zeros(shape=(0, self.EventPreWindow+1+self.EventPostWindow)) self._Output["异常协方差"] = np.zeros(shape=(0, self.EventPreWindow+1+self.EventPostWindow, self.EventPreWindow+1+self.EventPostWindow)) self._Output["事件记录"] = np.full(shape=(0, 3), fill_value=None, dtype="O")# [ID, 时点, 事件发生距离当前的时点数] self._AllDTs = self._FactorTable.getDateTime() if self.EstSampleFilter: self._CompiledIDFilterStr, self._FilterFactors = testIDFilterStr(self.EstSampleFilter, self._FactorTable.FactorNames) if not self._AllDTs: self._AllDTs = dts return (self._FactorTable, )
def genConstraint(self): if not self.TargetIDs: UpConstraint = pd.Series(self.UpLimit, index=self._PC._TargetIDs) DownConstraint = pd.Series(self.DownLimit, index=self._PC._TargetIDs) else: UpConstraint = pd.Series(np.inf, index=self._PC._TargetIDs) DownConstraint = pd.Series(-np.inf, index=self._PC._TargetIDs) CompiledIDFilterStr, IDFilterFactors = testIDFilterStr(self.TargetIDs) TargetIDs = filterID(self._PC.FactorData.loc[:, IDFilterFactors]) TargetIDs = list(set(TargetIDs).intersection(self._PC._TargetIDs)) UpConstraint[TargetIDs] = self.UpLimit DownConstraint[TargetIDs] = self.DownLimit if self.Benchmark: UpConstraint += self._PC.BenchmarkHolding DownConstraint += self._PC.BenchmarkHolding return [{"type":"Box", "lb":DownConstraint.values.reshape((self._PC._nID, 1)), "ub":UpConstraint.values.reshape((self._PC._nID, 1))}]
def _getDefaultNontradableIDFilter(data_source=None, nonbuyable=True, qs_env=None): if data_source is None: return None with shelve.open(qs_env.SysArgs['LibPath'] + os.sep + 'IDFilter') as LibFile: if nonbuyable: DefaultNontradableIDFilter = LibFile.get('默认限买条件') else: DefaultNontradableIDFilter = LibFile.get('默认限卖条件') if DefaultNontradableIDFilter is not None: CompiledIDFilterStr, IDFilterFactors = testIDFilterStr( DefaultNontradableIDFilter, data_source.FactorNames) if CompiledIDFilterStr is not None: return DefaultNontradableIDFilter AllFactorNames = set(data_source.FactorNames) if {'交易状态', '涨跌停'}.issubset(AllFactorNames): if nonbuyable: DefaultNontradableIDFilter = "(@交易状态==0) | (@交易状态==-2) | pd.isnull(@交易状态) | (@涨跌停==1)" else: DefaultNontradableIDFilter = "(@交易状态==0) | (@交易状态==-2) | pd.isnull(@交易状态) | (@涨跌停==-1)" elif '交易状态' in AllFactorNames: DefaultNontradableIDFilter = "(@交易状态==0) | (@交易状态==-2) | pd.isnull(@交易状态)" elif {'是否在市', '涨跌停'}.issubset(AllFactorNames): if nonbuyable: DefaultNontradableIDFilter = "(@是否在市!=1) | (@涨跌停==1)" else: DefaultNontradableIDFilter = "(@是否在市!=1) | (@涨跌停==-1)" elif '是否在市' in AllFactorNames: DefaultNontradableIDFilter = "(@是否在市!=1)" elif '涨跌停' in AllFactorNames: if nonbuyable: DefaultNontradableIDFilter = "(@涨跌停==1)" else: DefaultNontradableIDFilter = "(@涨跌停==-1)" else: DefaultNontradableIDFilter = None return DefaultNontradableIDFilter