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
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