def __QS_readData__(self, factor_names=None, ids=None, dts=None, args={}): if dts: StartDate, EndDate = dts[0].date(), dts[-1].date() else: StartDate, EndDate = None, None if factor_names is None: factor_names = self.FactorNames RawData = self._getRawData(factor_names, ids, start_date=StartDate, end_date=EndDate, args=args) if StartDate is None: StartDate = dt.datetime.strptime(np.min(RawData["纳入日期"].values), "%Y%m%d").date() DateSeries = getDateSeries(StartDate, dt.date.today()) else: DateSeries = getDateSeries(dts[0].date(), dts[-1].date()) Data = {} for iIndexID in factor_names: iRawData = RawData[RawData["指数ID"]==iIndexID].set_index(["ID"]) iData = pd.DataFrame(0, index=DateSeries, columns=pd.unique(iRawData.index)) for jID in iData.columns: jIDRawData = iRawData.loc[[jID]] for k in range(jIDRawData.shape[0]): kStartDate = dt.datetime.strptime(jIDRawData["纳入日期"].iloc[k], "%Y%m%d").date() kEndDate = (dt.datetime.strptime(jIDRawData["剔除日期"].iloc[k], "%Y%m%d").date()-dt.timedelta(1) if jIDRawData["剔除日期"].iloc[k] is not None else dt.date.today()) iData[jID].loc[kStartDate:kEndDate] = 1 Data[iIndexID] = iData Data = pd.Panel(Data).loc[factor_names] Data.major_axis = [dt.datetime.combine(iDate, dt.time(0)) for iDate in Data.major_axis] Data.fillna(value=0, inplace=True) return adjustDateTime(Data, dts, fillna=True, method="bfill")
def calcAvgReturnPerYearday(wealth_seq, dts, dt_ruler=None): DenseWealthSeq, dts = _densifyWealthSeq(wealth_seq, dts, dt_ruler) YeardayYield = np.zeros((366, ) + DenseWealthSeq.shape[1:]) YeardayNum = np.zeros(366) YeardaySeq = [iDT.strftime("%m%d") for iDT in getDateSeries(start_dt=dt.date(2000, 1, 1), end_dt=dt.date(2000, 12, 31))] for i, iDT in enumerate(dts[1:]): iInd = YeardaySeq.index(iDT.strftime("%m%d")) YeardayNum[iInd] += 1 YeardayYield[iInd] += DenseWealthSeq[i+1] / DenseWealthSeq[i] - 1 for i in range(366): if YeardayNum[i]==0: YeardayYield[i] = np.nan else: YeardayYield[i] = YeardayYield[i] / YeardayNum[i] return pd.DataFrame(YeardayYield, index=YeardaySeq)