Этот пример показывает рабочий процесс, чтобы оценить Vanilla инструмент, когда вы используете Heston и различные методы ценообразования модели.
Vanilla Инструментальный объектИспользуйте fininstrument создать Vanilla инструментальный объект.
Settle = datetime(2017,6,29); Maturity = datemnth(Settle,6); Strike = 80; VanillaOpt = fininstrument('Vanilla','ExerciseDate',Maturity,'Strike',Strike,'Name',"vanilla_option")
VanillaOpt =
Vanilla with properties:
OptionType: "call"
ExerciseStyle: "european"
ExerciseDate: 29-Dec-2017
Strike: 80
Name: "vanilla_option"
Heston Объект моделиИспользуйте finmodel создать Heston объект модели.
V0 = 0.04; ThetaV = 0.05; Kappa = 1.0; SigmaV = 0.2; RhoSV = -0.7; HestonModel = finmodel("Heston",'V0',V0,'ThetaV',ThetaV,'Kappa',Kappa,'SigmaV',SigmaV,'RhoSV',RhoSV)
HestonModel =
Heston with properties:
V0: 0.0400
ThetaV: 0.0500
Kappa: 1
SigmaV: 0.2000
RhoSV: -0.7000
ratecurve объектСоздайте ratecurve объект с помощью ratecurve.
Rate = 0.03;
ZeroCurve = ratecurve('zero',Settle,Maturity,Rate);NumericalIntegrationfft, и FiniteDifference Объекты калькулятора ценИспользуйте finpricer создать NumericalIntegrationfft, и FiniteDifference объекты калькулятора цен и использование ratecurve объект для 'DiscountCurve' аргумент пары "имя-значение".
SpotPrice = 80; Strike = 80; DividendYield = 0.02; NIPricer = finpricer("NumericalIntegration",'Model', HestonModel,'SpotPrice',SpotPrice,'DiscountCurve',ZeroCurve,'DividendValue',DividendYield)
NIPricer =
NumericalIntegration with properties:
Model: [1x1 finmodel.Heston]
DiscountCurve: [1x1 ratecurve]
SpotPrice: 80
DividendType: "continuous"
DividendValue: 0.0200
AbsTol: 1.0000e-10
RelTol: 1.0000e-10
IntegrationRange: [1.0000e-09 Inf]
CharacteristicFcn: @characteristicFcnHeston
Framework: "heston1993"
VolRiskPremium: 0
LittleTrap: 1
FFTPricer = finpricer("FFT",'Model',HestonModel, ... 'SpotPrice',SpotPrice,'DiscountCurve',ZeroCurve, ... 'DividendValue',DividendYield,'NumFFT',8192)
FFTPricer =
FFT with properties:
Model: [1x1 finmodel.Heston]
DiscountCurve: [1x1 ratecurve]
SpotPrice: 80
DividendType: "continuous"
DividendValue: 0.0200
NumFFT: 8192
CharacteristicFcnStep: 0.0100
LogStrikeStep: 0.0767
CharacteristicFcn: @characteristicFcnHeston
DampingFactor: 1.5000
Quadrature: "simpson"
VolRiskPremium: 0
LittleTrap: 1
FDPricer = finpricer("FiniteDifference",'Model',HestonModel,'SpotPrice',SpotPrice,'DiscountCurve',ZeroCurve,'DividendValue',DividendYield)
FDPricer =
FiniteDifference with properties:
DiscountCurve: [1x1 ratecurve]
Model: [1x1 finmodel.Heston]
SpotPrice: 80
GridProperties: [1x1 struct]
DividendType: "continuous"
DividendValue: 0.0200
Vanilla ИнструментИспользуйте следующую чувствительность при оценке Vanilla инструмент.
InpSensitivity = ["delta", "gamma", "theta", "rho", "vega", "vegalt"];
Используйте price вычислить цену и чувствительность для Vanilla инструмент, который использует NumericalIntegration калькулятор цен.
[PriceNI, outPR_NI] = price(NIPricer,VanillaOpt,InpSensitivity)
PriceNI = 4.7007
outPR_NI =
priceresult with properties:
Results: [1x7 table]
PricerData: []
Используйте price вычислить цену и чувствительность для Vanilla инструмент, который использует FFT калькулятор цен.
[PriceFFT, outPR_FFT] = price(FFTPricer,VanillaOpt,InpSensitivity)
PriceFFT = 4.7007
outPR_FFT =
priceresult with properties:
Results: [1x7 table]
PricerData: []
Используйте price вычислить цену и чувствительность для Vanilla инструмент, который использует FiniteDifference калькулятор цен.
[PriceFD, outPR_FD] = price(FDPricer,VanillaOpt,InpSensitivity)
PriceFD = 4.7003
outPR_FD =
priceresult with properties:
Results: [1x7 table]
PricerData: [1x1 struct]
Агрегируйте ценовые результаты.
[outPR_NI.Results;outPR_FFT.Results;outPR_FD.Results]
ans=3×7 table
Price Delta Gamma Theta Rho Vega VegaLT
______ _______ ________ _______ ______ ______ ______
4.7007 0.57747 0.03392 -4.8474 20.805 17.028 5.2394
4.7007 0.57747 0.03392 -4.8474 20.805 17.028 5.2394
4.7003 0.57722 0.035254 -4.8483 20.801 17.046 5.2422
Используйте price функция для NumericalIntegration калькулятор цен и price функция для FFT калькулятор цен, чтобы вычислить цены на область значений Vanilla инструменты.
Maturities = datemnth(Settle,(3:3:24)'); NumMaturities = length(Maturities); Strikes = (20:10:160)'; NumStrikes = length(Strikes); [Maturities_Full,Strikes_Full] = meshgrid(Maturities,Strikes); NumInst = numel(Strikes_Full); VanillaOptions(NumInst, 1) = fininstrument("vanilla",... "ExerciseDate", Maturities_Full(1), "Strike", Strikes_Full(1)); for instidx=1:NumInst VanillaOptions(instidx) = fininstrument("vanilla",... "ExerciseDate", Maturities_Full(instidx), "Strike", Strikes_Full(instidx)); end Prices_NI = price(NIPricer, VanillaOptions); Prices_FFT = price(FFTPricer, VanillaOptions); figure; surf(Maturities_Full,Strikes_Full,reshape(Prices_NI,[NumStrikes,NumMaturities])); title('Price (Numerical Integration)'); view(-112,34); xlabel('Maturity') ylabel('Strike')

figure; surf(Maturities_Full,Strikes_Full,reshape(Prices_FFT,[NumStrikes,NumMaturities])); title('Price (FFT)'); view(-112,34); xlabel('Maturity') ylabel('Strike')
