/ / QuantLib для Python RuntimeError: vega не надано - python, python-3.x, quantlib, quantlib-swig

QuantLib для Python RuntimeError: vega не надано - python, python-3.x, quantlib, quantlib-swig

Оцінка простого ванільного американського варіанта з біноміальним двигуном ціноутворення та моделлю Кокса-Рубінштейна. При спробі завантажити vega я отримую помилку суб'єкта:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/conda/lib/python3.6/site-packages/QuantLib.py", line 10506, in vega
return _QuantLib.VanillaOption_vega(self)
RuntimeError: vega not provided

Це не дивлячись vega бути методом american_option:

>>> dir(american_option)  # scroll to the right -->
["NPV", "__class__", "__del__", "__delattr__", "__deref__", "__dict__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__gt__", "__hash__", "__init__", "__init_subclass__", "__le__", "__lt__", "__module__", "__ne__", "__new__", "__nonzero__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "__swig_destroy__", "__weakref__", "asObservable", "delta", "dividendRho", "errorEstimate", "freeze", "gamma", "impliedVolatility", "isExpired", "priceCurve", "recalculate", "rho", "setPricingEngine", "strikeSensitivity", "theta", "thetaPerDay", "this", "thisown", "unfreeze", "vega"]

Ось код, який грунтується на декількох онлайн-прикладах:

>>> from QuantLib import *
>>> maturity_date = Date(15, 1, 2016)
>>> spot_price = 127.62
>>> strike_price = 130
>>> volatility = 0.20 # the historical vols for a year
>>> dividend_rate =  0.0163
>>> option_type = Option.Call
>>> risk_free_rate = 0.001
>>> day_count = Actual365Fixed()
>>> calendar = UnitedStates()
>>> calculation_date = Date(8, 5, 2015)
>>> Settings.instance().evaluationDate = calculation_date
>>> payoff = PlainVanillaPayoff(option_type, strike_price)
>>> settlement = calculation_date
>>> am_exercise = AmericanExercise(settlement, maturity_date)
>>> american_option = VanillaOption(payoff, am_exercise)
>>> spot_handle = QuoteHandle(
...             SimpleQuote(spot_price)
...         )
>>> flat_ts = YieldTermStructureHandle(
...     FlatForward(calculation_date,
...                 risk_free_rate,
...                 day_count)
... )
>>> dividend_yield = YieldTermStructureHandle(
...     FlatForward(calculation_date,
...                 dividend_rate,
...                 day_count)
... )
>>> flat_vol_ts = BlackVolTermStructureHandle(
...     BlackConstantVol(calculation_date,
...                      calendar,
...                      volatility,
...                      day_count)
... )
>>> bsm_process = BlackScholesMertonProcess(spot_handle,
...                                         dividend_yield,
...                                         flat_ts,
...                                         flat_vol_ts)
>>>
>>>
>>> binomial_engine = BinomialVanillaEngine(bsm_process, "crr", 100)
>>> american_option.setPricingEngine(binomial_engine)
>>> print(american_option.vega())

Версії:

>>> import QuantLib
>>> print(QuantLib.__version__)
1.11

Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49)

Питання, чому не передбачено Вега? Що викликає помилку?

Відповіді:

1 для відповіді № 1

The VanillaOption клас декларує vega метод, але останній може повернути результат лише тоді, коли вибраний двигун обчислює його.

Загалом, двигуни, що використовують аналітичну формулуздатні дешево повернути греків, тому що вони також мають аналітичне вираження; двигун на основі біноміального дерева, як і той, який ви використовуєте, не має простий спосіб обчислити vega. Для того, щоб забезпечити його, він повинен виконати дорогу операцію (тобто перерахувати з обуреним нестабільністю та отримати чисельну вартість вега), і тому вона виходить з ладу і залишає її вам явно виконувати дорогий розрахунок.

У цьому випадку ви можете обчислити vega, збільшивши волатильність, обчисливши нову ціну опціону та обчислюючи похідну чисельно.

Я докладніше про це розповідаю і наведу кілька основних прикладів у це відео.