Exemple #1
0
 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")
Exemple #2
0
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)