def _calculateBODRisk(self, contract, riskTenors=[], startTenors=[], rates=[]): riskCurveId = '_risk_%s' % 'BOD' rc = self._buildSwapCurve(riskCurveId, self.endDate, self.indexName, self.bodIndexCurve, self.bodDiscCurve, riskTenors, startTenors, riskRates=rates) fwdCurveName, discCurveName, curveEngineName = rc[0] numCurvePoints = len(riskTenors) fairRates = self._extractFairRate(rc) # print 'FairRates: ', fairRates print '\nBuilding curve pack for BOD risk' curveDate = self.endDate curvePackName = '_riskCurvePack_%s' % curveDate.strftime('%Y%m%d') rc = p.py_BuildCurvePack(curvePackName, curveEngineName) print 'Built curve pack %s' % rc curveMap = [('Index', 'Curve'), (self.curveMapIndex, fwdCurveName)] print '\nCalculating BOD risk...' rcIndex = p.py_CurvePackRisk(curvePackName, instrumentNames=[contract], curveMap=curveMap, discountCurveName=discCurveName, showBasePv=True, riskMode="index") rcDisc = p.py_CurvePackRisk(curvePackName, instrumentNames=[contract], curveMap=curveMap, discountCurveName=discCurveName, showBasePv=True, riskMode="discount") # print('\nCurvePackRisk:') # pprint.pprint(rc) return (rcIndex, rcDisc, fairRates)
def runIMMRIsk(): bucketDates = p.py_IMMNextDates(anchorDate, 30, '3M', datetime.date(2025, 2, 25), 'CFFEX') print '\n\nIMM dates: ' pprint.pprint(bucketDates) bucketDates = [anchorDate] + list(bucketDates) rc = p.py_BuildRPCurvePack(curvePackName, [curveName, discCurveName], bucketDates) print '\nBuilt RP curve pack: %s' % rc rc = p.py_CurvePackRisk(curvePackName, instrumentNames=[swapId], curveMap=[('Index', 'Curve'), ('_' + indexName, curveName)], discountCurveName=discCurveName, showBasePv=True) print '\nCurvePackRisk:' pprint.pprint(rc)
def runCFETSCurveRisk(): rc = p.py_BuildSwapCurve(swapCurveId, anchorDate, indexName, tenors, rates, curveName, discCurveName) print '\n\nBuilt swap curve: ' pprint.pprint(rc, width=500) curve, discCurve, curveEngineName = rc[0] rc = p.py_BuildCurvePack(curvePackName, curveEngineName) print '\nBuilt curve pack %s' % rc rc = p.py_CurvePackRisk(curvePackName, instrumentNames=[swapId], curveMap=[('Index', 'Curve'), ('_' + indexName, curve)], discountCurveName=discCurve, showBasePv=True) pprint.pprint('\nCurvePackRisk:') pprint.pprint(rc)
def _calculateRisk(self, curveTemplate='RISK', ignoreFixing=False, startTenors=[]): curveEngineName, indexCurveName, discCurveName = self._createSwapCurve( curveTemplate=curveTemplate, startTenors=startTenors) rc = p.py_BuildCurvePack(self.curvePackName, curveEngineName) print 'Built curve pack %s' % rc curveMap = [('Index', 'Curve'), ('_' + self.indexName, indexCurveName)] rc = p.py_CurvePackRisk(self.curvePackName, instrumentNames=[self.contract], curveMap=curveMap, discountCurveName=discCurveName, forecastTodaysFixing=ignoreFixing, showBasePv=True) pprint.pprint('\nCurvePackRisk:') pprint.pprint(rc) return rc
def _calculateRisk(self, curve, curveDate): tenors, rates = self.pdayMktData riskCurveId = '_risk_%s' % self.indexName # rc = p.py_BuildSwapCurve(riskCurveId, self.endDate, self.indexName, tenors, rates, curve, useExtCurveAsBase=False, template='RISK') rc = p.py_BuildSwapCurve(riskCurveId, curveDate, self.indexName, tenors, rates, curve) fwdCurveName, discCurveName, curveEngineName = rc[0] curvePackName = '_riskCurvePack_%s' % curveDate.strftime('%Y%m%d') rc = p.py_BuildCurvePack(curvePackName, curveEngineName) print 'Built curve pack %s' % rc curveMap = [('Index', 'Curve'), ('_' + self.indexName, fwdCurveName)] rc = p.py_CurvePackRisk(curvePackName, instrumentNames=[self.contract], curveMap=curveMap, discountCurveName=discCurveName, showBasePv=True) # print('\nCurvePackRisk:') # pprint.pprint(rc) return rc
def runIMMRisk(self): curve = self._createCfetsCurve() bucketDates = p.py_IMMNextDates(self.anchorDate, 40, '3M', datetime.date(2028, 12, 23), 'CFFEX') print '\n\nIMM dates: ' pprint.pprint(bucketDates) bucketDates = [self.anchorDate] + list(bucketDates) rc = p.py_BuildRPCurvePack(self.curvePackName, [curve, curve], bucketDates) print '\nBuilt RP curve pack: %s' % rc curveMap = curveMap = [('Index', 'Curve'), ('_' + self.indexName, curve)] rc = p.py_CurvePackRisk(self.curvePackName, instrumentNames=[self.contract], curveMap=curveMap, discountCurveName=curve, showBasePv=True) print '\nCurvePackRisk:' pprint.pprint(rc)
def _calculateIMMEstimate(self, contract): print '\nBuilding IMM curve pack' curveDate = self.endDate curvePackName = '_immriskCurvePack_%s' % curveDate.strftime('%Y%m%d') immDates = p.py_IMMNextDates(self.endDate, 40, '3M', datetime.date(2028, 12, 23), 'CFFEX') # print '\n\nIMM dates: ' # pprint.pprint(immDates) startDates = [self.endDate] + list(immDates)[:-1] rc = p.py_BuildRPCurvePack(curvePackName, [self.bodIndexCurve, self.bodDiscCurve], startDates) print '\nBuilt RP curve pack: %s' % rc curveMap = [('Index', 'Curve'), (self.curveMapIndex, self.bodIndexCurve)] rcDisc = p.py_CurvePackRisk(curvePackName, instrumentNames=[contract], curveMap=curveMap, discountCurveName=self.bodDiscCurve, showBasePv=True, riskMode='discount') discDelta = [r[1] for r in rcDisc[2:]] rcIndex = p.py_CurvePackRisk(curvePackName, instrumentNames=[contract], curveMap=curveMap, discountCurveName=self.bodDiscCurve, showBasePv=True, riskMode='index') indexDelta = [r[1] for r in rcIndex[2:]] """ print '\nCurvePackRisk:' print 'Index risk:' pprint.pprint(rcIndex) print 'Discount risk:' pprint .pprint(rcDisc) """ bodIndexRates = p.py_YieldTSForwardRate(self.bodIndexCurve, startDates, immDates, self.dayCount) bodDiscRates = p.py_YieldTSForwardRate(self.bodDiscCurve, startDates, immDates, self.dayCount) """ print "Index forward rates:" print bodIndexRates print "Discount forward rates:" print bodDiscRates """ liveIndexRates = p.py_YieldTSForwardRate(self.liveIndexCurve, startDates, immDates, self.dayCount) liveDiscRates = p.py_YieldTSForwardRate(self.liveDiscCurve, startDates, immDates, self.dayCount) """ print "Index forward rates:" print liveIndexRates print "Discount forward rates:" print liveDiscRates """ indexEstimate = [ risk * (live - bod) * 10000.0 for risk, live, bod in zip( indexDelta, liveIndexRates, bodIndexRates) ] discEstimate = [ risk * (live - bod) * 10000.0 for risk, live, bod in zip(discDelta, liveDiscRates, bodDiscRates) ] print 'IMM dates:' symDates = p.py_IMMDateToSymbol(immDates) print symDates print ', '.join(['{:,.0f}'] * len(indexEstimate)).format(*indexEstimate) print ', '.join(['{:,.0f}'] * len(discEstimate)).format(*discEstimate) immEstimate = sum(indexEstimate) + sum(discEstimate) return immEstimate