def scenarioHistF(self, st, en, scenarioName, num):
        ''' 情景分布生成 '''
        # if self.TradeTime == '2017-06-08':
        #     pass
        scenarioSummary = {u'mean': {}, u'std': {}, u'IR': {}, u'sortino': {}, u'sharpe': {}}
        distDict = {u'mean': {}, u'std': {}, u'IR': {}, u'sortino': {}, u'sharpe': {}}
        scenarioCond = copy.deepcopy(self.scenarioCond)
        scenarioIndex = scenarioCond[scenarioCond == scenarioName].index
        # scenarioPeriod = pd.Series(index=freqTransfer(scenarioIndex, freq='W').to_series().astype(str).values)
        scenarioSeries = pd.Series(scenarioIndex, index=scenarioIndex)
        targePeriodIndex = scenarioSeries.loc[st:en].index

        pct_Data = self.pct_fund.loc[targePeriodIndex]
        colLen = pct_Data.count(axis=0)
        lenFilter = colLen[colLen >= num].index
        rptFilter = self.fundLatestRptDate[self.fundLatestRptDate >= self.TradeTime].index
        filterData = pct_Data[lenFilter & rptFilter]

        scenarioSummary[u'mean'][scenarioName] = filterData.mean(axis=0)  # 默认skipna=True
        scenarioSummary[u'std'][scenarioName] = filterData.std(axis=0)
        tempMean = copy.deepcopy(scenarioSummary[u'mean'][scenarioName])
        tempStd = copy.deepcopy(scenarioSummary[u'std'][scenarioName])
        rf = 0.1/252.

        # timeDecayWeight = pd.DataFrame(np.transpose([(dateGap/dateGap.sum()).values] * len(filterData.columns)), index=targePeriodIndex, columns=filterData.columns)
        # timeDecayData = pd.eval('filterData * timeDecayWeight')
        # weightedMean = timeDecayData.mean(axis=0)
        # weightedStd = np.sqrt((np.power(filterData - weightedMean, 2) * np.power(timeDecayWeight/len(targePeriodIndex), 2)).sum(axis=0))
        # scenarioSummary[u'sharpe'][scenarioName] = (weightedMean - rf)/weightedStd

        tempIR = copy.deepcopy(tempMean)
        # # 下行标准差
        # filterDf = pct_Data[lenFilter & rptFilter]
        # downsideStd = filterDf[pd.eval('filterDf < tempMean')]
        # downsideStd = np.sqrt(np.power(downsideStd, 2).sum() / float(num))
        # tempSortino = copy.deepcopy(tempMean)

        # tempIR[pd.eval('tempMean > rf')] = ((tempMean - rf)/tempStd)[pd.eval('tempMean > rf')].values
        # tempIR[pd.eval('tempMean < -rf')] = ((tempMean + rf)/tempStd)[pd.eval('tempMean < -rf')].values
        # tempIR[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'IR'][scenarioName] = tempIR                                   # 不包含变动小的基金
        # scenarioSummary[u'IR'][scenarioName] = tempMean/tempStd                         # 含变动小的基金

        scenarioSummary[u'sharpe'][scenarioName] = (tempMean - rf)/tempStd

        # tempSortino[pd.eval('tempMean > rf')] = ((tempMean - rf) / downsideStd)[pd.eval('tempMean > rf')].values
        # tempSortino[pd.eval('tempMean < -rf')] = ((tempMean + rf) / downsideStd)[pd.eval('tempMean < -rf')].values
        # tempSortino[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'sortino'][scenarioName] = tempSortino                         # 不包含变动小的基金

        distDict[u'sharpe'][scenarioName] = seriesTop(scenarioSummary[u'sharpe'][scenarioName], 10, ascending=False)[0]
        # distDict[u'IR'][scenarioName] = seriesTop(scenarioSummary[u'IR'][scenarioName], 5, ascending=False)[0]
        # rank = distDict[u'IR'][scenarioName].to_csv('rank.csv')
        # distDict[u'IR'][scenarioName] = seriesPercentage(scenarioSummary[u'IR'][scenarioName], 0.01, u'right')[0]     # 历史分布--百分比
        return distDict
예제 #2
0
    def scenarioHistF(self, st, en, scenarioName, num):
        ''' 情景分布生成 '''

        scenarioSummary = {
            u'mean': {},
            u'std': {},
            u'IR': {},
            u'sortino': {},
            u'sharp': {}
        }
        distDict = {
            u'mean': {},
            u'std': {},
            u'IR': {},
            u'sortino': {},
            u'sharp': {}
        }

        scenarioCond = copy.deepcopy(self.scenarioCond)
        scenarioIndex = scenarioCond[scenarioCond == scenarioName].index
        scenarioSeries = pd.Series(scenarioIndex, index=scenarioIndex)
        targePeriodIndex = scenarioSeries.loc[st:en].index
        pct_Data = self.pct_fund.loc[targePeriodIndex]
        colLen = pct_Data.count(axis=0)
        lenFilter = colLen[colLen >= num].index

        # tempLen = pct_Data.index.size
        # tempGap = math.e
        # a1 = 1./sum([pow(tempGap, i) for i in range(tempLen)])
        # dataGap = [a1] + [a1*pow(tempGap, i)for i in range(1, tempLen)]
        rf = 0.1 / 252.

        filterData = pct_Data[lenFilter]

        scenarioSummary[u'mean'][scenarioName] = filterData.mean(
            axis=0)  # 默认skipna=True
        scenarioSummary[u'std'][scenarioName] = filterData.std(axis=0)
        tempMean = copy.deepcopy(scenarioSummary[u'mean'][scenarioName])
        tempStd = copy.deepcopy(scenarioSummary[u'std'][scenarioName])

        # 时间衰减IR -- 测试效果不好
        # timeDecayWeight = pd.DataFrame(np.transpose([dataGap] * len(filterData.columns)), index=targePeriodIndex, columns=filterData.columns)
        # timeDecayData = pd.eval('filterData * timeDecayWeight')
        # weightedMean = timeDecayData.mean(axis=0)
        # weightedStd = np.sqrt((np.power(filterData - weightedMean, 2) * np.power(timeDecayWeight/tempLen, 2)).sum(axis=0))
        # scenarioSummary[u'sharp'][scenarioName] = (weightedMean - rf)/weightedStd

        # # 下行标准差
        # filterDf = pct_Data[lenFilter & rptFilter]
        # downsideStd = filterDf[pd.eval('filterDf < tempMean')]
        # downsideStd = np.sqrt(np.power(downsideStd, 2).sum() / float(num))
        # tempSortino = copy.deepcopy(tempMean)

        tempIR = copy.deepcopy(tempMean)
        # tempIR[pd.eval('tempMean > rf')] = ((tempMean - rf)/tempStd)[pd.eval('tempMean > rf')].values
        # tempIR[pd.eval('tempMean < -rf')] = ((tempMean + rf)/tempStd)[pd.eval('tempMean < -rf')].values
        # tempIR[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'IR'][scenarioName] = tempIR                                 # 不包含变动小的基金
        # scenarioSummary[u'IR'][scenarioName] = tempMean/tempStd                         # 含变动小的基金

        # 夏普率
        scenarioSummary[u'sharp'][scenarioName] = (tempMean - rf) / tempStd

        # tempSortino[pd.eval('tempMean > rf')] = ((tempMean - rf) / downsideStd)[pd.eval('tempMean > rf')].values
        # tempSortino[pd.eval('tempMean < -rf')] = ((tempMean + rf) / downsideStd)[pd.eval('tempMean < -rf')].values
        # tempSortino[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'sortino'][scenarioName] = tempSortino                     # 不包含变动小的基金

        # tempIR.to_csv('IR.csv')
        t = seriesTop(scenarioSummary[u'sharp'][scenarioName],
                      5,
                      ascending=False)[0]
        distDict[u'sharp'][scenarioName] = seriesTop(
            scenarioSummary[u'sharp'][scenarioName], 5, ascending=False)[0]
        # distDict[u'IR'][scenarioName] = seriesTop(scenarioSummary[u'IR'][scenarioName], 10, ascending=False)[0]
        # rank = distDict[u'IR'][scenarioName].to_csv('rank.csv')
        # distDict[u'IR'][scenarioName] = seriesPercentage(scenarioSummary[u'IR'][scenarioName], 0.01, u'right')[0]     # 历史分布--百分比
        return distDict
    def scenarioHistF2(self, longRef, shortRef, scenarioName, num):
        ''' 情景分布函数:长短维度'''

        scenarioSummary = {
            u'mean': {},
            u'std': {},
            u'IR': {},
            u'sortino': {},
            u'sharpe': {}
        }
        distDict = {
            u'mean': {},
            u'std': {},
            u'IR': {},
            u'sortino': {},
            u'sharpe': {}
        }
        rf = 0.07 / 252
        en = self.getTime(ref=1)  # 上一天
        longSt = self.getTime(ref=longRef)
        shortSt = self.getTime(ref=shortRef)

        if scenarioName:
            scenarioCond = copy.deepcopy(self.scenarioCond)
            scenarioIndex = scenarioCond[scenarioCond == scenarioName].index
            scenarioSeries = pd.Series(scenarioIndex, index=scenarioIndex)
            targePeriodIndex = scenarioSeries.loc[longSt:en].index
            pct_Data = self.pct_fund.loc[targePeriodIndex]
        else:
            pct_Data = self.pct_fund.loc[longSt:en]
            pct_Data_short = self.pct_fund.loc[shortSt:en]
        colLen = pct_Data.count(axis=0)
        lenFilter = colLen[colLen >= num].index

        filterData = pct_Data[lenFilter]
        filterData_short = pct_Data_short[lenFilter]

        scenarioSummary[u'mean'][scenarioName] = filterData.mean(
            axis=0)  # 默认skipna=True
        scenarioSummary[u'std'][scenarioName] = filterData.std(axis=0)
        tempMean = scenarioSummary[u'mean'][scenarioName]
        tempStd = scenarioSummary[u'std'][scenarioName]
        shortMean = filterData_short[lenFilter].mean(axis=0)
        shortStd = filterData_short[lenFilter].std(axis=0)

        # 时间衰减IR -- 测试效果不好
        # timeDecayWeight = pd.DataFrame(np.transpose([dataGap] * len(filterData.columns)), index=targePeriodIndex, columns=filterData.columns)
        # timeDecayData = pd.eval('filterData * timeDecayWeight')
        # weightedMean = timeDecayData.mean(axis=0)
        # weightedStd = np.sqrt((np.power(filterData - weightedMean, 2) * np.power(timeDecayWeight/tempLen, 2)).sum(axis=0))
        # scenarioSummary[u'sharpe'][scenarioName] = (weightedMean - rf)/weightedStd

        # 下行标准差
        # downsideStd = filterData[pd.eval('filterData < tempMean')]
        # downsideStd = np.sqrt(np.power(downsideStd, 2).sum() / float(num))
        # tempSortino = copy.deepcopy(tempMean)
        # tempSortino[pd.eval('tempMean > rf')] = ((tempMean - rf) / downsideStd)[pd.eval('tempMean > rf')].values
        # tempSortino[pd.eval('tempMean < -rf')] = ((tempMean + rf) / downsideStd)[pd.eval('tempMean < -rf')].values
        # tempSortino[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'sortino'][scenarioName] = tempSortino                       # 不包含变动小的基金
        # downsideStd_short = filterData_short[pd.eval('filterData_short < shortMean')]
        # downsideStd_short = np.sqrt(np.power(downsideStd_short, 2).sum() / float(num))
        # tempSortino_short = (shortMean - rf)/downsideStd_short
        # tempSortino_short[pd.eval('shortMean > rf')] = ((shortMean - rf) / downsideStd_short)[pd.eval('shortMean > rf')].values
        # tempSortino_short[pd.eval('shortMean < -rf')] = ((shortMean + rf) / downsideStd_short)[pd.eval('shortMean < -rf')].values
        # tempSortino_short[pd.eval('shortMean >= -rf and shortMean <= rf')] = 0.

        # tempIR = copy.deepcopy(tempMean)
        # tempIR[pd.eval('tempMean > rf')] = ((tempMean - rf)/tempStd)[pd.eval('tempMean > rf')].values
        # tempIR[pd.eval('tempMean < -rf')] = ((tempMean + rf)/tempStd)[pd.eval('tempMean < -rf')].values
        # tempIR[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.
        # scenarioSummary[u'IR'][scenarioName] = tempIR                                 # 不包含变动小的基金
        # scenarioSummary[u'IR'][scenarioName] = tempMean/tempStd                         # 含变动小的基金

        # # 夏普率
        scenarioSummary[u'sharpe'][scenarioName] = (tempMean - rf) / tempStd
        # tempSharpe_short = (shortMean - 0.06/252)/shortStd

        # tempIR.to_csv('IR.csv')
        # distDict[u'IR'][scenarioName] = seriesTop(scenarioSummary[u'IR'][scenarioName], 10, ascending=False)[0]
        # rank = distDict[u'IR'][scenarioName].to_csv('rank.csv')
        # distDict[u'IR'][scenarioName] = seriesPercentage(scenarioSummary[u'IR'][scenarioName], 0.01, u'right')[0]     # 历史分布--百分比
        longSort = seriesTop(scenarioSummary[u'sharpe'][scenarioName],
                             5,
                             ascending=False)[0]  # 长期
        # shortSort = seriesTop(shortMean.loc[longSort.index], 5, ascending=False)[0]          # 短期
        # longSort = seriesTop(tempMean, 5, ascending=False)[0]  # 长期
        distDict[u'sharpe'][scenarioName] = longSort
        return distDict
    def scenarioHistF2(self, st, en, scenarioName, num, dataType):
        ''' 情景分布生成 '''

        scenarioCond = copy.deepcopy(self.scenarioCond)
        scenarioIndex = scenarioCond[scenarioCond == scenarioName].index
        scenarioSeries = pd.Series(scenarioIndex, index=scenarioIndex)
        targePeriodIndex = scenarioSeries.loc[st:en].index

        # pct_Data = self.pct_fund.loc[targePeriodIndex]
        pct_Data = self.pct_fund.loc[targePeriodIndex]
        colLen = pct_Data.count(axis=0)
        lenFilter = colLen[colLen >= num].index
        pct_Data = pct_Data[lenFilter]

        if dataType == u'IR':
            # 超额收益,带相关性
            tempDf = pd.concat(
                [pct_Data, self.tempBenchPct.loc[targePeriodIndex]], axis=1)
            corrSeries = tempDf.corr().loc[u'close'].loc[lenFilter].dropna()
            corrFilter = corrSeries.index
            tempBenchPct = self.tempBenchPctDf[
                lenFilter & corrFilter].loc[targePeriodIndex] * corrSeries
            exPct = pct_Data[corrFilter] - tempBenchPct

        # 时间衰减IR
        # tempLen = pct_Data.index.size
        # tempGap = math.e
        # a1 = 1./sum([pow(tempGap, i) for i in range(tempLen)])
        # dataGap = [a1] + [a1*pow(tempGap, i)for i in range(1, tempLen)]

        fundType = [u'股票型基金', u'债券型基金', u'混合型基金']
        typeDict = {}
        for typeName in fundType:
            scenarioSummary = {
                u'mean': {},
                u'std': {},
                u'IR': {},
                u'sortino': {},
                u'sharpe': {}
            }
            rf = 0.1 / 252.
            if typeName == u'股票型基金':
                timeFilter = self.stockLatest.index[
                    self.stockLatest['最新净值日期'] > en]
            elif typeName == u'债券型基金':
                rf = 0.05 / 252.
                timeFilter = self.fixedincomeLatest.index[
                    self.fixedincomeLatest['最新净值日期'] > en]
            elif typeName == u'混合型基金':
                timeFilter = self.hybridLatest.index[
                    self.hybridLatest['最新净值日期'] > en]

            if dataType == u'IR':
                filterData = exPct[exPct.columns & timeFilter]
            elif dataType == u'sharpe':
                filterData = pct_Data[pct_Data.columns & timeFilter]
            tempMean = filterData.mean(axis=0)  # 默认skipna=True
            tempStd = filterData.std(axis=0)

            # 时间衰减IR -- 测试效果不好
            # timeDecayWeight = pd.DataFrame(np.transpose([dataGap] * len(filterData.columns)), index=targePeriodIndex, columns=filterData.columns)
            # timeDecayData = pd.eval('filterData * timeDecayWeight')
            # weightedMean = timeDecayData.mean(axis=0)
            # weightedStd = np.sqrt((np.power(filterData - weightedMean, 2) * np.power(timeDecayWeight/tempLen, 2)).sum(axis=0))
            # weightedIR = (weightedMean - rf)/weightedStd

            # # 下行标准差
            # downsideStd = filterDf[pd.eval('filterDf < tempMean')]
            # downsideStd = np.sqrt(np.power(downsideStd, 2).sum() / float(num))
            # tempSortino = copy.deepcopy(tempMean)
            # tempSortino[pd.eval('tempMean > rf')] = ((tempMean - rf) / downsideStd)[pd.eval('tempMean > rf')].values
            # tempSortino[pd.eval('tempMean < -rf')] = ((tempMean + rf) / downsideStd)[pd.eval('tempMean < -rf')].values
            # tempSortino[pd.eval('tempMean >= -rf and tempMean <= rf')] = 0.

            # if scenarioName == u'显著上升':
            #     sortData = tempMean
            # elif scenarioName == u'震荡':
            #     sortData = (tempMean - rf) / tempStd  # 不含变动小的基金
            # else:
            #     sortData = (tempMean - rf) / tempStd  # 不含变动小的基金
            sortData = (tempMean - rf) / tempStd  # 不含变动小的基金
            sortResult = seriesTop(sortData, 10, ascending=False)[0]
            # sortResult = seriesPercentage(scenarioSummary[dataType][scenarioName], 0.01, u'right')[0]     # 历史分布--百分比
            typeDict[typeName] = {dataType: {scenarioName: sortResult}}
        return typeDict