01 job220
job220
(Process)calculate-shock-spread.md
0. 금리커브 단위로 반복
for (IrCurve irCurve :irCurveList) {
// 내부변수 add
String irCurveNm = irCurve.getIrCurveNm() ;
IrParamSw irparamSw = commIrParamSw.get(irCurveNm) ;
IrParamModel irModelMst = irModelMstMap.get(irCurveNm) ;
1. check
1.1.irCurveSwMap
if(!commIrParamSw.containsKey(irCurveNm)) {
log.warn("No Ir Curve Data [{}] in Smith-Wilson Map for [{}]"
, irCurveNm
, bssd);
continue;
}
1.2. modelMstMap
if(!irModelMstMap.containsKey(irCurveNm)) {
log.warn("No Model Attribute of [{}] for [{}] in [{}] Table"
, irModelNm
, irCurveNm
, Process.toPhysicalName(IrParamModel.class.getSimpleName()));
continue;
}
log.info("AFNS Shock Spread (Cont) for [{}({}, {})]"
, irCurveNm
, irCurve.getIrCurveNm()
, irCurve.getCurCd()
);
1.3. spot rate에 기준일 테너별 데이터 존재 체크
List<String> tenorList = IrCurveSpotDao.getIrCurveTenorList
( bssd
, irCurveNm
, Math.min(irparamSw.getLlp(), 20)
);
log.info("TenorList in [{}]: ID: [{}], llp: [{}], matCd: {}"
, jobLog.getJobId()
, irCurveNm
, Math.min(irparamSw.getLlp(), 20)
, tenorList
);
if(tenorList.isEmpty()) {
log.warn("No Spot Rate Data [ID: {}] for [{}]", irCurveNm, bssd);
continue;
}
2.delete
2.1. IrParamAfnsCalc
int delNum1 = session.createQuery(
"delete IrParamAfnsCalc a
where baseYymm=:param1
and a.irModelNm=:param2
and a.irCurveNm=:param3")
.setParameter("param1", bssd)
.setParameter("param2", irModelNm)
.setParameter("param3", irCurveNm)
.executeUpdate();
log.info("[{}] has been Deleted
in Job:[{}] [IR_MODEL_ID: {}, IR_CURVE_NM: {}, COUNT: {}]"
, Process.toPhysicalName(IrParamAfnsCalc.class.getSimpleName())
, jobLog.getJobId()
, irModelNm
, irCurveNm
, delNum1);
2.2.IrSprdAfnsCalc
int delNum2 = session.createQuery("delete IrSprdAfnsCalc a
where baseYymm=:param1
and a.irModelNm=:param2
and a.irCurveNm=:param3")
.setParameter("param1", bssd)
.setParameter("param2", irModelNm)
.setParameter("param3", irCurveNm)
.executeUpdate();
log.info("[{}] has been Deleted
in Job:[{}] [IR_MODEL_ID: {}, IR_CURVE_NM: {}, COUNT: {}]"
, Process.toPhysicalName(IrSprdAfnsCalc.class.getSimpleName())
, jobLog.getJobId()
, irModelNm
, irCurveNm
, delNum2);
3. 필요 데이터 준비
3.1.spot rate his (금리내역)
List<IrCurveSpotWeek> weekHisList = IrCurveSpotWeekDao.getIrCurveSpotWeekHis
( bssd
, iRateHisStBaseDate
, irCurveNm
, tenorList
, weekDay
, false);
List<IrCurveSpotWeek> weekHisBizList = IrCurveSpotWeekDao.getIrCurveSpotWeekHis
( bssd
, iRateHisStBaseDate
, irCurveNm
, tenorList
, weekDay
, true);
log.info("weekHisList: [{}], [TOTAL: {}, BIZDAY: {}], [from {} to {}, weekDay:{}]"
, irCurveNm
, weekHisList.size()
, weekHisBizList.size()
, iRateHisStBaseDate.substring(0,6)
, bssd
, weekDay);
3.2. 충분성 검토
if(weekHisList.size() < 1000) {
log.warn("Weekly SpotRate Data is not Enough [ID: {}, SIZE: {}] for [{}]"
, irCurveNm
, weekHisList.size()
, bssd);
continue;
}
List<IrCurveSpot> curveHisList= weekHisList.stream()
.map(s->s.convertToHis())
.collect(toList());
3.3. 당월 금리 데이터 (모수)
AFNS 모형에서 모수 추정시 제약조건으로 현재 금리커브와 동일한지 확인용.
//Any curveBaseList result in same parameters and spreads.
List<IrCurveSpot> curveBaseList = IrCurveSpotDao.getIrCurveSpot
(bssd, irCurveNm, tenorList);
if(curveBaseList.size()==0) {
log.warn("No IR Curve Data [IR_CURVE_NM: {}] for [{}]"
, irCurveNm
, bssd);
continue;
}
4. biz logic
Map<String, List<?>> irShockSenario = new TreeMap<String, List<?>>();
irShockSenario = Esg220_ShkSprdAfns.createAfnsShockScenario
( FinUtils.toEndOfMonth(bssd)
, curveHisList
, curveBaseList
, irModelMst // add
, irparamSw // add
, argInDBMap // add
);
5. save
for(Map.Entry<String, List<?>> rslt : irShockSenario.entrySet()) {
rslt.getValue().forEach(s -> session.save(s));
session.flush();
session.clear();
}
}
6.log
completeJob("SUCCESS", jobLog);
##