342 lines
7.5 KiB
C#
342 lines
7.5 KiB
C#
/*
|
|
* dbMango
|
|
*
|
|
* Copyright 2025 Deutsche Bank AG
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
namespace Tests.Rms.Risk.Mango.Language.Data;
|
|
|
|
public static class RhoBreakdownByTenor
|
|
{
|
|
public const string Pipeline =
|
|
"""
|
|
[{
|
|
"$match" : {
|
|
"$and" : [{
|
|
"$and" : [{
|
|
"COB" : { "$date" : "2025-04-25T00:00:00Z" }
|
|
}]
|
|
}]
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"RhoDetails.OpeningRho" : "$RhoDetails.OpeningRho",
|
|
"RhoDetails.ClosingRho" : "$RhoDetails.ClosingRho",
|
|
"RhoDetails.RhoImpact" : "$RhoDetails.RhoImpact",
|
|
"RhoDetails.Rho2ndOrderImpact" : "$RhoDetails.Rho2ndOrderImpact",
|
|
"CurvePrefix" : {
|
|
"$concat" : [{
|
|
"$dateToString" : {
|
|
"format" : "%Y%m%d",
|
|
"date" : "$COB"
|
|
}
|
|
}, "-", {
|
|
"$toString" : "$OpeningYcRateSetId"
|
|
}, "-", {
|
|
"$toString" : "$ClosingYcRateSetId"
|
|
}, "-PnL-YC", {
|
|
"$ifNull" : ["$Ds2CurveType", ""]
|
|
}, "-"]
|
|
}
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"CurvePrefix" : 1,
|
|
"Data" : {
|
|
"$objectToArray" : "$RhoDetails"
|
|
}
|
|
}
|
|
}, {
|
|
"$unwind" : {
|
|
"path" : "$Data"
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"CurvePrefix" : 1,
|
|
"Type" : "$Data.k",
|
|
"Data" : {
|
|
"$objectToArray" : "$Data.v"
|
|
}
|
|
}
|
|
}, {
|
|
"$unwind" : {
|
|
"path" : "$Data"
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"CurvePrefix" : {
|
|
"$concat" : ["$CurvePrefix", "$Data.k", "-"]
|
|
},
|
|
"Type" : 1,
|
|
"Ccy" : "$Data.v.Ccy",
|
|
"Curve" : {
|
|
"$ifNull" : ["$Data.v.Curve", "$Data.v.CurveName", "$Data.v.CurveType"]
|
|
},
|
|
"FundingName" : "$Data.v.FundingName",
|
|
"Data" : {
|
|
"$objectToArray" : "$Data.v.Data"
|
|
}
|
|
}
|
|
}, {
|
|
"$unwind" : {
|
|
"path" : "$Data",
|
|
"includeArrayIndex" : "Order"
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"CurveKey" : {
|
|
"$concat" : ["$CurvePrefix", "$Data.k"]
|
|
},
|
|
"Ccy" : 1,
|
|
"Curve" : 1,
|
|
"FundingName" : 1,
|
|
"Tenor" : "$Data.k",
|
|
"Order" : 1,
|
|
"Data" : [{
|
|
"Type" : "$Type",
|
|
"Value" : "$Data.v"
|
|
}]
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"CurveKey" : 1,
|
|
"Ccy" : 1,
|
|
"Curve" : 1,
|
|
"FundingName" : 1,
|
|
"Tenor" : 1,
|
|
"Order" : 1,
|
|
"Value" : {
|
|
"$arrayToObject" : {
|
|
"$map" : {
|
|
"input" : "$Data",
|
|
"as" : "d",
|
|
"in" : ["$$d.Type", "$$d.Value"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
"$group" : {
|
|
"_id" : {
|
|
"CurveKey" : "$CurveKey",
|
|
"Ccy" : "$Ccy",
|
|
"Curve" : "$Curve",
|
|
"FundingName" : "$FundingName",
|
|
"Tenor" : "$Tenor"
|
|
},
|
|
"Order" : {
|
|
"$max" : "$Order"
|
|
},
|
|
"OpeningRho" : {
|
|
"$sum" : "$Value.OpeningRho"
|
|
},
|
|
"ClosingRho" : {
|
|
"$sum" : "$Value.ClosingRho"
|
|
},
|
|
"RhoImpact" : {
|
|
"$sum" : "$Value.RhoImpact"
|
|
},
|
|
"Rho2ndOrderImpact" : {
|
|
"$sum" : "$Value.Rho2ndOrderImpact"
|
|
}
|
|
}
|
|
}, {
|
|
"$match" : {
|
|
"$or" : [{
|
|
"RhoImpact" : {
|
|
"$gt" : 1E-08
|
|
}
|
|
}, {
|
|
"RhoImpact" : {
|
|
"$lt" : -1E-08
|
|
}
|
|
}, {
|
|
"Rho2NdOrderImpact" : {
|
|
"$gt" : 1E-08
|
|
}
|
|
}, {
|
|
"Rho2NdOrderImpact" : {
|
|
"$lt" : -1E-08
|
|
}
|
|
}]
|
|
}
|
|
}, {
|
|
"$lookup" : {
|
|
"from" : "PnL-Market",
|
|
"localField" : "_id.CurveKey",
|
|
"foreignField" : "_id",
|
|
"as" : "Market"
|
|
}
|
|
}, {
|
|
"$unwind" : {
|
|
"path" : "$Market"
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"Order" : "$Order",
|
|
"OpeningCurve" : "$Market.Opening",
|
|
"ClosingCurve" : "$Market.Closing",
|
|
"CurveMove" : "$Market.Move",
|
|
"OpeningRho" : "$OpeningRho",
|
|
"ClosingRho" : "$ClosingRho",
|
|
"RhoMove" : {
|
|
"$subtract" : ["$ClosingRho", "$OpeningRho"]
|
|
},
|
|
"RhoImpact" : "$RhoImpact",
|
|
"Rho2ndOrderImpact" : "$Rho2ndOrderImpact"
|
|
}
|
|
}, {
|
|
"$sort" : {
|
|
"_id.Ccy" : 1,
|
|
"_id.Curve" : 1,
|
|
"_id.FundingName" : 1,
|
|
"Tenor" : 1,
|
|
"Order" : 1
|
|
}
|
|
}, {
|
|
"$project" : {
|
|
"_id" : {
|
|
"Ccy" : 1,
|
|
"Curve" : 1,
|
|
"FundingName" : 1,
|
|
"Tenor" : 1
|
|
},
|
|
"OpeningCurve" : "$OpeningCurve",
|
|
"ClosingCurve" : "$ClosingCurve",
|
|
"CurveMove" : "$CurveMove",
|
|
"OpeningRho" : "$OpeningRho",
|
|
"ClosingRho" : "$ClosingRho",
|
|
"RhoMove" : "$RhoMove",
|
|
"RhoImpact" : "$RhoImpact",
|
|
"Rho2ndOrderImpact" : "$Rho2ndOrderImpact"
|
|
}
|
|
}]
|
|
""";
|
|
|
|
public const string Script =
|
|
"""
|
|
FROM "TestCollection" PIPELINE {
|
|
WHERE
|
|
COB == date( "2025-04-25T00:00:00Z" )
|
|
PROJECT
|
|
$RhoDetails.OpeningRho,
|
|
$RhoDetails.ClosingRho,
|
|
$RhoDetails.RhoImpact,
|
|
$RhoDetails.Rho2ndOrderImpact,
|
|
concat( dateToString(
|
|
format: "%Y%m%d",
|
|
date: COB
|
|
), "-", toString( OpeningYcRateSetId ), "-", toString( ClosingYcRateSetId ), "-PnL-YC", ifNull( Ds2CurveType, "" ), "-" ) AS CurvePrefix
|
|
PROJECT
|
|
CurvePrefix,
|
|
objectToArray( RhoDetails ) AS Data
|
|
UNWIND Data
|
|
PROJECT
|
|
CurvePrefix,
|
|
$Data.k AS Type,
|
|
objectToArray( $Data.v ) AS Data
|
|
UNWIND Data
|
|
PROJECT
|
|
concat( CurvePrefix, $Data.k, "-" ) AS CurvePrefix,
|
|
Type,
|
|
$Data.v.Ccy AS Ccy,
|
|
ifNull( $Data.v.Curve, $Data.v.CurveName, $Data.v.CurveType ) AS Curve,
|
|
$Data.v.FundingName AS FundingName,
|
|
objectToArray( $Data.v.Data ) AS Data
|
|
UNWIND Data INDEX Order
|
|
PROJECT
|
|
concat( CurvePrefix, $Data.k ) AS CurveKey,
|
|
Ccy,
|
|
Curve,
|
|
FundingName,
|
|
$Data.k AS Tenor,
|
|
Order,
|
|
[
|
|
{
|
|
Type,
|
|
$Data.v AS Value
|
|
}
|
|
] AS Data
|
|
PROJECT
|
|
CurveKey,
|
|
Ccy,
|
|
Curve,
|
|
FundingName,
|
|
Tenor,
|
|
Order,
|
|
arrayToObject( map(
|
|
input: Data,
|
|
as: "d",
|
|
in: [
|
|
"$$d.Type",
|
|
"$$d.Value"
|
|
]
|
|
) ) AS Value
|
|
GROUP BY
|
|
CurveKey,
|
|
Ccy,
|
|
Curve,
|
|
FundingName,
|
|
Tenor
|
|
LET
|
|
max( Order ) AS Order,
|
|
sum( $Value.OpeningRho ) AS OpeningRho,
|
|
sum( $Value.ClosingRho ) AS ClosingRho,
|
|
sum( $Value.RhoImpact ) AS RhoImpact,
|
|
sum( $Value.Rho2ndOrderImpact ) AS Rho2ndOrderImpact
|
|
WHERE
|
|
(RhoImpact > 1E-08
|
|
OR RhoImpact < -1E-08
|
|
OR Rho2NdOrderImpact > 1E-08
|
|
OR Rho2NdOrderImpact < -1E-08)
|
|
JOIN "PnL-Market" AS Market ON
|
|
$_id.CurveKey == _id
|
|
UNWIND Market
|
|
PROJECT
|
|
Order,
|
|
$Market.Opening AS OpeningCurve,
|
|
$Market.Closing AS ClosingCurve,
|
|
$Market.Move AS CurveMove,
|
|
OpeningRho,
|
|
ClosingRho,
|
|
ClosingRho - OpeningRho AS RhoMove,
|
|
RhoImpact,
|
|
Rho2ndOrderImpact
|
|
SORT BY
|
|
$_id.Ccy,
|
|
$_id.Curve,
|
|
$_id.FundingName,
|
|
Tenor,
|
|
Order
|
|
PROJECT ID {
|
|
Ccy,
|
|
Curve,
|
|
FundingName,
|
|
Tenor
|
|
}
|
|
OpeningCurve,
|
|
ClosingCurve,
|
|
CurveMove,
|
|
OpeningRho,
|
|
ClosingRho,
|
|
RhoMove,
|
|
RhoImpact,
|
|
Rho2ndOrderImpact
|
|
}
|
|
|
|
""";
|
|
|
|
}
|