QuantLib для Python RuntimeError: вега не предоставляется

Ценообразование простого ванильного американского опциона с помощью биномиального механизма ценообразования и модели Кокса-Рубинштейна. При попытке получить вегу я получаю сообщение об ошибке:

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)

Вопрос почему не предусмотрена вега? Что вызывает ошибку?


person Jason Strimpel    schedule 31.01.2018    source источник


Ответы (1)


Класс VanillaOption объявляет метод vega, но последний может возвращать результат только в том случае, если выбранный движок вычисляет его.

В общем, машины, использующие аналитическую формулу, способны дешево вернуть греков, потому что у них тоже есть аналитическое выражение; движок, основанный на биномиальном дереве, такой как тот, который вы используете, не имеет простого способа вычисления веги. Чтобы обеспечить это, он должен выполнить дорогостоящую операцию (то есть пересчитать с возмущенной волатильностью и получить вегу численно), и поэтому он выручает и оставляет вам возможность выполнить дорогостоящий расчет в явном виде.

В этом случае вы можете рассчитать вегу, увеличив волатильность, рассчитав новую цену опциона и вычислив производную численно.

Я подробно расскажу об этом и приведу несколько основных примеров в этом видео.

person Luigi Ballabio    schedule 31.01.2018