gpt4 book ai didi

quantlib - Quantlib 中的 FX vanilla 看涨期权价格与彭博不符

转载 作者:行者123 更新时间:2023-12-02 03:40:35 38 4
gpt4 key购买 nike

普通欧洲 EURUSD 看涨期权的 Quantlib 价格与彭博 OVML 价格不匹配。

例如对于以下选项 Quantlib 值 =4.60991,BBG 值 =4.6137,错误 =0.0038(虽然它应该是 ~1e-6 差异)

据我所知,波动的时间和贴现或漂移的时间应该根据确切的时期和时间进行调整。例如,贴现期应为结算日至交割日,波动期应为交易日至到期日。考虑到到期时间和交易时间的差异,还应正确表达波动率参数。

但是,我在 Quantlib 中没有看到一个选项来说明交付日期与到期日期不同。我如何考虑结算调整(例如 EURUSD 的结算日期为 T+2,即现货/交易日期后 2 天,或 USDCAD 的 T+1)和延迟交割调整(交割日期为 T+2,即到期后 2 天),如 Clark, Iain J. 外汇期权定价:从业者指南中所述。 John Wiley & Sons,2011 年,第 33 页,和“Wystup、Uwe。外汇期权和结构化产品。John Wiley & Sons,2015 年。第 26-29 页”

这是BBG截图 enter image description here

国内/国外汇率(复合式 MMkt): enter image description here

代码

int main(){

    QuantLib::Real S = 100; 
QuantLib::Real K = 105;
QuantLib::Spread f = 0.05;// Foreign rate (EUR in EURUSD)
QuantLib::Rate r = 0.02; // Domestic rate (USD in EURUSD)
QuantLib::Volatility vol = 0.2;
QuantLib::DayCounter dayCounter = Actual365Fixed();
QuantLib::Date evaluationDate = Date(13, Feb, 2018);
QuantLib::Date settlementDate = evaluationDate + Period(2, Days);//T+2 = Date(15, Feb, 2018);
QuantLib::Date expirationDate = settlementDate + Period(1, Years); //Date(15, May, 2019);
Calendar calendar = UnitedStates(UnitedStates::NYSE);
Exercise::Type exerciseType = Exercise::European;
Real result = 4.6137;
Real tol = 1e-3; // tolerance
Option::Type optionType = Option::Call;
Compounding compounding = Compounded;
Frequency compoundingFrequency = Semiannual;
VanillaOptionData vanillaOptionData = { S, K, f, r, vol, dayCounter, evaluationDate, settlementDate,
expirationDate, calendar,exerciseType, result, tol, optionType, compounding, compoundingFrequency };
calculator_fx_vanilla_black_scholes(vanillaOptionData);

//results
//calculated value=4.60991, expected value=4.6137, error=0.00379258
return 0;
}

void calculator_fx_vanilla_black_scholes(VanillaOptionData in){

Calendar calendar = TARGET();

Settings::instance().evaluationDate() = in.evaluationDate;

boost::shared_ptr<Exercise> exercise= boost::make_shared<EuropeanExercise>(in.expirationDate);


Handle<Quote>underlyingH(boost::shared_ptr<Quote>(new SimpleQuote(in.S)));

Handle<YieldTermStructure> rTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(in.settlementDate, in.r, in.dayCounter, in.compounding, in.compoundingFrequency)));

Handle<YieldTermStructure> fTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(in.settlementDate, in.f, in.dayCounter, in.compounding, in.compoundingFrequency)));

Handle<BlackVolTermStructure> flatVolTS(boost::shared_ptr<BlackVolTermStructure>(new BlackConstantVol(in.settlementDate, calendar, in.vol, in.dayCounter)));

boost::shared_ptr<StrikedTypePayoff>payoff(new PlainVanillaPayoff(in.optionType, in.K));

boost::shared_ptr<GarmanKohlagenProcess>process(new GarmanKohlagenProcess(underlyingH, fTS, rTS, flatVolTS));

VanillaOption option(payoff, exercise);

boost::shared_ptr<PricingEngine> pe(new AnalyticEuropeanEngine(process));

option.setPricingEngine(pe);

Real calculated = option.NPV();

Real expected = in.result;

Real error = std::fabs(calculated - expected);

cout << "calculated value=" << calculated << ", expected value=" << expected << ", error=" << error << endl;

相关:https://quant.stackexchange.com/questions/33604/pricing-of-a-foreign-exchange-vanilla-option

最佳答案

我遇到了同样的问题。对于一年期的 EUR/USD 普通看涨期权,通过调用 Quantlib 并遵循 Clark 书中的公式,它将产生略小于 1 个基点的微小差异。

经过一些彻底的测试,我能够确定为什么会出现差异。 Quantlib Black Scholes 库使用两个日期进行所有计算,即 evaluation_date(即今天)和 delivery_date。

那么,如果有四个日期:evaluation_date(即今天)、SpotDate、expiry_date(即成熟期)、delivery_date。 Quantlib Black Scholes 公式将只假设两个日期,付款日期为 delivery_date,所有相关条款都打折回 evaluation_Date。

如果你能接触到源码,cpp文件,d1,d2的实际计算如下图,高亮部分: enter image description here

请注意,上面的forward是交割日的远期汇率,它是根据评估日的汇率推导出来的,是国内外市场交割日和评估日之间的贴现因子。stdDev 就是波动率 * sqrt(T)。

最后在同一个文件blackcalculator.cpp中计算option的值,如下: enter image description here

上图中的折扣是evaluation_date和deivery_date之间的国内折扣系数。这样我们就可以在 evaluation_date 上得到最终结果,记为 MV_evalDate。这与 Bloomberg 或 Murex 上的值不完全匹配,因为在 Murex 上,它是按现货日期报价的。我们需要将 evaluation_date 的结果转发到现货日期,然后我们得到现货日期的市场值(value)为 MV_spotDate = MV_evalDate * exp(domestic_rate * timefrac_between_evalDate_spotDate) = MV_evalDate/domestic_discountfactor_evalDate_spotDate。

然后我们可以得到即期市场值(value)的匹配结果,或者Clark的书第32页(2.86)的公式中显示的结算调整结果。

关于quantlib - Quantlib 中的 FX vanilla 看涨期权价格与彭博不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48778712/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com