Skip to content

Commit 3130769

Browse files
authored
Merge of #2767
2 parents 2dd0d3f + a2fc90b commit 3130769

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

modules/measure/src/main/java/com/opengamma/strata/measure/capfloor/IborCapFloorMeasureCalculations.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,41 @@ private PointSensitivities pointSensitivity(
195195
return tradePricer.presentValueSensitivityRates(trade, ratesProvider, volatilities);
196196
}
197197

198+
//-------------------------------------------------------------------------
199+
// calculates normal vega for all scenarios
200+
ScenarioArray<CurrencyParameterSensitivities> vegaMarketQuoteBucketed(
201+
ResolvedIborCapFloorTrade trade,
202+
RatesScenarioMarketData ratesMarketData,
203+
IborCapFloorScenarioMarketData capFloorMarketData) {
204+
205+
IborIndex index = trade.getProduct().getCapFloorLeg().getIndex();
206+
return ScenarioArray.of(
207+
ratesMarketData.getScenarioCount(),
208+
i -> vegaMarketQuoteBucketed(
209+
trade,
210+
ratesMarketData.scenario(i).ratesProvider(),
211+
capFloorMarketData.scenario(i).volatilities(index)));
212+
}
213+
214+
// vega for one scenario
215+
CurrencyParameterSensitivities vegaMarketQuoteBucketed(
216+
ResolvedIborCapFloorTrade trade,
217+
RatesProvider ratesProvider,
218+
IborCapletFloorletVolatilities volatilities) {
219+
220+
PointSensitivities pointSensitivity = pointSensitivityVega(trade, ratesProvider, volatilities);
221+
return volatilities.parameterSensitivity(pointSensitivity);
222+
}
223+
224+
// vega point sensitivity
225+
private PointSensitivities pointSensitivityVega(
226+
ResolvedIborCapFloorTrade trade,
227+
RatesProvider ratesProvider,
228+
IborCapletFloorletVolatilities volatilities) {
229+
230+
return tradePricer.presentValueSensitivityModelParamsVolatility(trade, ratesProvider, volatilities).build();
231+
}
232+
198233
//-------------------------------------------------------------------------
199234
// calculates currency exposure for all scenarios
200235
MultiCurrencyScenarioArray currencyExposure(

modules/measure/src/main/java/com/opengamma/strata/measure/capfloor/IborCapFloorTradeCalculationFunction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@
4343
* <li>{@linkplain Measures#PV01_CALIBRATED_BUCKETED PV01 calibrated bucketed on rate curves}
4444
* <li>{@linkplain Measures#PV01_MARKET_QUOTE_SUM PV01 market quote sum on rate curves}
4545
* <li>{@linkplain Measures#PV01_MARKET_QUOTE_BUCKETED PV01 market quote bucketed on rate curves}
46+
* <li>{@linkplain Measures#VEGA_MARKET_QUOTE_BUCKETED vega market quote bucketed on vol surfaces}
4647
* <li>{@linkplain Measures#CURRENCY_EXPOSURE Currency exposure}
4748
* <li>{@linkplain Measures#CURRENT_CASH Current cash}
48-
* <li>{@linkplain Measures#CURRENT_CASH Current cash}
4949
* <li>{@linkplain Measures#RESOLVED_TARGET Resolved trade}
5050
* </ul>
5151
* <p>
@@ -64,6 +64,7 @@ public class IborCapFloorTradeCalculationFunction
6464
.put(Measures.PV01_CALIBRATED_BUCKETED, IborCapFloorMeasureCalculations.DEFAULT::pv01RatesCalibratedBucketed)
6565
.put(Measures.PV01_MARKET_QUOTE_SUM, IborCapFloorMeasureCalculations.DEFAULT::pv01RatesMarketQuoteSum)
6666
.put(Measures.PV01_MARKET_QUOTE_BUCKETED, IborCapFloorMeasureCalculations.DEFAULT::pv01RatesMarketQuoteBucketed)
67+
.put(Measures.VEGA_MARKET_QUOTE_BUCKETED, IborCapFloorMeasureCalculations.DEFAULT::vegaMarketQuoteBucketed)
6768
.put(Measures.CURRENCY_EXPOSURE, IborCapFloorMeasureCalculations.DEFAULT::currencyExposure)
6869
.put(Measures.CURRENT_CASH, IborCapFloorMeasureCalculations.DEFAULT::currentCash)
6970
.put(Measures.RESOLVED_TARGET, (rt, smd, m) -> rt)

modules/measure/src/test/java/com/opengamma/strata/measure/capfloor/IborCapFloorTradeCalculationFunctionTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@
3232
import com.opengamma.strata.calc.runner.FunctionRequirements;
3333
import com.opengamma.strata.collect.result.Result;
3434
import com.opengamma.strata.data.scenario.MultiCurrencyScenarioArray;
35+
import com.opengamma.strata.data.scenario.ScenarioArray;
3536
import com.opengamma.strata.data.scenario.ScenarioMarketData;
3637
import com.opengamma.strata.market.curve.ConstantCurve;
3738
import com.opengamma.strata.market.curve.Curve;
3839
import com.opengamma.strata.market.curve.CurveId;
3940
import com.opengamma.strata.market.curve.Curves;
4041
import com.opengamma.strata.market.observable.IndexQuoteId;
42+
import com.opengamma.strata.market.param.CurrencyParameterSensitivities;
4143
import com.opengamma.strata.measure.Measures;
4244
import com.opengamma.strata.measure.curve.TestMarketDataMap;
4345
import com.opengamma.strata.measure.rate.RatesMarketDataLookup;
@@ -116,18 +118,23 @@ public void test_simpleMeasures() {
116118
MultiCurrencyAmount expectedPv = pricer.presentValue(RTRADE, provider, VOLS);
117119
MultiCurrencyAmount expectedCurrencyExposure = pricer.currencyExposure(RTRADE, provider, VOLS);
118120
MultiCurrencyAmount expectedCurrentCash = pricer.currentCash(RTRADE, provider, VOLS);
121+
CurrencyParameterSensitivities expectedVegaBucketed =
122+
VOLS.parameterSensitivity(pricer.presentValueSensitivityModelParamsVolatility(RTRADE, provider, VOLS).build());
119123

120124
Set<Measure> measures = ImmutableSet.of(
121125
Measures.PRESENT_VALUE,
122126
Measures.CURRENCY_EXPOSURE,
123-
Measures.CURRENT_CASH);
127+
Measures.CURRENT_CASH,
128+
Measures.VEGA_MARKET_QUOTE_BUCKETED);
124129
assertThat(function.calculate(TRADE, measures, PARAMS, md, REF_DATA))
125130
.containsEntry(
126131
Measures.PRESENT_VALUE, Result.success(MultiCurrencyScenarioArray.of(ImmutableList.of(expectedPv))))
127132
.containsEntry(
128133
Measures.CURRENCY_EXPOSURE, Result.success(MultiCurrencyScenarioArray.of(ImmutableList.of(expectedCurrencyExposure))))
129134
.containsEntry(
130-
Measures.CURRENT_CASH, Result.success(MultiCurrencyScenarioArray.of(ImmutableList.of(expectedCurrentCash))));
135+
Measures.CURRENT_CASH, Result.success(MultiCurrencyScenarioArray.of(ImmutableList.of(expectedCurrentCash))))
136+
.containsEntry(
137+
Measures.VEGA_MARKET_QUOTE_BUCKETED, Result.success(ScenarioArray.of(ImmutableList.of(expectedVegaBucketed))));
131138
}
132139

133140
//-------------------------------------------------------------------------

0 commit comments

Comments
 (0)