Wyceń amerykańską opcję zwykłej wanilii z dwumianowym silnikiem cenowym i modelem Cox-Rubinsteina. Podczas próby odzyskania vegi pojawia się błąd tematu:
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
Mimo to vega
jest metodą 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"]
Oto kod, który opiera się na kilku przykładach online:
>>> 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())
Wersje:
>>> import QuantLib
>>> print(QuantLib.__version__)
1.11
Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49)
Pytanie brzmi, dlaczego vega nie jest dostarczana? Co powoduje błąd?
Odpowiedzi:
1 dla odpowiedzi № 1The VanillaOption
klasa deklaruje vega
metoda, ale ta ostatnia może zwrócić wynik tylko wtedy, gdy wybrany silnik ją oblicza.
Ogólnie, silniki, które używają formuły analitycznejsą w stanie zwracać Grekom tanio, ponieważ mają także analityczną ekspresję; silnik oparty na drzewie dwumianowym, taki jak ten, którego używasz, nie ma prostego sposobu na obliczenie vegi. Aby to zapewnić, powinien wykonać kosztowną operację (to znaczy ponownie przeliczyć ją z zaburzoną zmiennością i uzyskać liczbową liczbę), a zatem wypuszcza ją i pozostawia użytkownikowi, aby jednoznacznie wykonać kosztowne obliczenia.
W takim przypadku można obliczyć vega, zwiększając zmienność, obliczając nową cenę opcji i obliczając pochodną numerycznie.
Omówię więcej na ten temat i podam kilka podstawowych przykładów ten film.