Hello team,
I keep getting the following error message while pricing structured products using QPS financial contracts API:
'Cannot price Structured Products. Invalid correlation data.'
It seems that when there are more than one Equity underliers the error would be triggered. I have priced similar products with single equity underlier with no issues.
Request body below.
{
"fields": [
"MarketValueInDealCcy",
"ErrorMessage"
],
"universe": [
{
"instrumentDefinition": {
"instrumentTag": "63873HEZ3",
"dealCcy": "USD",
"inputs": [
{
"type": "string",
"name": "CUSIP",
"value": "63873HEZ3"
},
{
"type": "string",
"name": "Issuer",
"value": "MS"
},
{
"type": "string",
"name": "Callable",
"value": "True"
},
{
"type": "string",
"name": "PrincipalAtRisk",
"value": "True"
},
{
"type": "string",
"name": "RangeAccrualType",
"value": "A"
},
{
"type": "string",
"name": "SOFR",
"value": "False"
},
{
"type": "string",
"name": "NumOfAssets",
"value": "2"
},
{
"type": "date",
"name": "TradeDate",
"value": "28/03/2016"
},
{
"type": "date",
"name": "ValuationDate",
"value": "26/03/2036"
},
{
"type": "date",
"name": "MaturityDate",
"value": "31/03/2036"
},
{
"type": "date",
"name": "StartDate",
"value": "31/03/2016"
},
{
"type": "date",
"name": "EndDate",
"value": "31/03/2036"
},
{
"type": "date",
"name": "RangeStart",
"value": "31/03/2020"
},
{
"type": "date",
"name": "RangeStart_2",
"value": "31/03/2026"
},
{
"type": "date",
"name": "CallStart",
"value": "31/03/2017"
},
{
"type": "date",
"name": "CallEnd",
"value": "31/03/2036"
},
{
"type": "string",
"name": "CMS_Long",
"value": "30Y"
},
{
"type": "string",
"name": "CMS_Short",
"value": "2Y"
},
{
"type": "string",
"name": "CpnB",
"value": "0.65"
},
{
"type": "string",
"name": "Trigger",
"value": "0.5"
},
{
"type": "string",
"name": "FixedCpn",
"value": "0.09"
},
{
"type": "string",
"name": "Cap",
"value": "0.1"
},
{
"type": "string",
"name": "Notional",
"value": "100"
},
{
"type": "string",
"name": "PayFreq",
"value": "M"
},
{
"type": "string",
"name": "CallFreq",
"value": "Q"
},
{
"type": "string",
"name": "CallGap",
"value": "-5B"
},
{
"type": "string",
"name": "ResetGap",
"value": "-2B"
},
{
"type": "string",
"name": "PayGap",
"value": "0B"
},
{
"type": "string",
"name": "DateRule",
"value": "ModifiedFollowing"
},
{
"type": "string",
"name": "Calendar",
"value": "NYSE"
},
{
"type": "string",
"name": "DayCount",
"value": "Act/Act"
},
{
"type": "string",
"name": "A_1",
"value": "SP500"
},
{
"type": "string",
"name": "A_2",
"value": "RUT"
},
{
"type": "string",
"name": "Initial_1",
"value": "2037.05"
},
{
"type": "string",
"name": "Initial_2",
"value": "1093.6"
},
{
"type": "string",
"name": "ResetArrear",
"value": "False"
},
{
"type": "string",
"name": "Leverage_Steps",
"value": "2"
},
{
"type": "string",
"name": "Leverage",
"value": "8.0"
},
{
"type": "string",
"name": "Leverage_2",
"value": "10.0"
},
{
"type": "string",
"name": "Spread",
"value": "0.0"
}
],
"payoffDescription": [
[
"Schedule type",
"Schedule description",
"Spot_1",
"Spot_2",
"WorstPerform",
"CMS_Spread",
"nday",
"Actday",
"Cpn",
"Redemption",
"Price"
],
[
"AtDate",
"TradeDate",
"Initial_1",
"Initial_2",
"",
"",
"$n=0",
"$act=0",
"",
"",
""
],
[
"AllTheTime",
"FromTo(RangeStart,MaturityDate,1b)",
"EqSpot(A_1)",
"EqSpot(A_2)",
"MIN(Spot_1[t]/Spot_1[1],Spot_2[t]/Spot_2[1])",
"",
"$n=$n+IF(WorstPerform[t]>=CpnB,1,0)",
"$act=$act+1",
"",
"",
""
],
[
"OnSchedule",
"DateTable(StartDate,RangeStart,PayFreq,DayCount,PayGap:=PayGap,ResetGap:=ResetGap,Arrear:=Yes,DateRule:=DateRule,Calendar:=Calendar)",
"",
"",
"",
"",
"",
"",
"FixedCpn*InterestTerm()",
"",
"Receive Notional*Cpn[t]"
],
[
"OnSchedule",
"DateTable(StartDate,EndDate,PayFreq,DayCount,PayGap:=PayGap,ResetGap:=ResetGap,Arrear:=Yes,DateRule:=DateRule,Calendar:=Calendar)",
"",
"",
"",
"Max(0,SwapRate(USD,EventDate(),CMS_Long)-SwapRate(USD,EventDate(),CMS_Short)+Spread)",
"",
"",
"",
"",
""
],
[
"OnSchedule",
"DateTable(RangeStart,RangeStart_2,PayFreq,DayCount,PayGap:=PayGap,ResetGap:=0B,Arrear:=Yes,DateRule:=DateRule,Calendar:=Calendar)",
"",
"",
"",
"",
"",
"",
"$n/$act*Min(Cap,Leverage*IF(\"ResetArrear\"==\"False\",CMS_Spread[LastDate(-1)],CMS_Spread[LastDate]))*InterestTerm()",
"",
"Receive Notional*Cpn[t];$n=0;$act=0"
],
[
"OnSchedule",
"DateTable(RangeStart_2,EndDate,PayFreq,DayCount,PayGap:=PayGap,ResetGap:=0B,Arrear:=Yes,DateRule:=DateRule,Calendar:=Calendar)",
"",
"",
"",
"",
"",
"",
"$n/$act*Min(Cap,Leverage_2*IF(\"ResetArrear\"==\"False\",CMS_Spread[LastDate(-1)],CMS_Spread[LastDate]))*InterestTerm()",
"",
"Receive Notional*Cpn[t];$n=0;$act=0"
],
[
"OnSchedule",
"DateTable(CallStart,CallEnd,CallFreq,DayCount,PayGap:=PayGap,ResetGap:=CallGap,Arrear:=False,DateRule:=DateRule,Calendar:=Calendar)",
"",
"",
"",
"",
"",
"",
"",
"",
"CallableBy(Them,Notional)"
],
[
"AtDate",
"ValuationDate",
"EqSpot(A_1)",
"EqSpot(A_2)",
"MIN(Spot_1[t]/Spot_1[1],Spot_2[t]/Spot_2[1])",
"",
"",
"",
"",
"IF(WorstPerform[t]>=Trigger,1,WorstPerform[t])",
"Receive(MaturityDate,Notional*Redemption[t])"
]
]
},
"pricingParameters": {
"models": [
{
"underlyingCode": "USD",
"underlyingName": "USD",
"underlyingCurrency": "USD",
"assetClass": "InterestRate",
"modelName": "HullWhite1Factor",
"modelParameters": {
"volatilityTermStructure": [
{
"value": 1.0,
"unit": "Percent"
}
],
"meanReversionTermStructure": [
{
"value": 1.0,
"unit": "Percent"
}
],
"volatilityModel": "NormalVolatility"
}
},
{
"underlyingCode": ".RUT",
"underlyingName": "RUT",
"underlyingCurrency": "USD",
"assetClass": "Equity",
"modelName": "Dupire"
},
{
"underlyingCode": ".SPX",
"underlyingName": "SP500",
"underlyingCurrency": "USD",
"assetClass": "Equity",
"modelName": "Dupire"
}
],
"numericalMethod": {
"allTheTimePointsPerYear": 260,
"method": "AmericanMonteCarlo",
"additionalPoints": 12,
"simulationCount": 1000
},
"fundingSpreadInBp": 0,
"forceDecreasingDiscountFactor": false,
"includeCashFlowsAtValuationDate": false,
"correlationReferenceCoefficientPercent": -100,
"correlationMultiplier": 1,
"numeraireType": "Cash",
"useBasisSwap": false,
"valuationDate": "2022-09-01"
},
"instrumentType": "StructuredProduct"
}
]
}