3 votos

¿Por qué el VAN de la opción Quantlib no cambia cuando se revaloriza?

Intentando aprender Quantlib con Python, por favor, eche un vistazo al siguiente código:

# option data
# AAPL US
maturity_date = ql.Date(26, 1, 2019)
spot_price = 180
strike_price = 180
volatility = 0.2198 # the historical vols or implied vols
option_type = ql.Option.Call
risk_free_rate = 0.025
day_count = ql.Actual365Fixed()
calendar = ql.UnitedStates()
calculation_date = ql.Date(1, 8, 2018)
ql.Settings.instance().evaluationDate = calculation_date
dividenddates = [ql.Date(10,8,2018), ql.Date(8, 11, 2018)]
dividends = [0.73,0.73]
spot_handle = ql.QuoteHandle(ql.SimpleQuote(spot_price))
flat_ts = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, risk_free_rate, day_count))
# dividend_yield = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, dividend_rate, day_count))
flat_vol_ts = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(calculation_date, calendar, volatility, day_count))
bs_process = ql.BlackScholesProcess(spot_handle,flat_ts, flat_vol_ts)
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
settlement = calculation_date
am_exercise = ql.AmericanExercise(settlement, maturity_date)
american_option = ql.DividendVanillaOption(payoff, am_exercise, dividenddates, dividends)
engine = ql.FDDividendAmericanEngine(bs_process)
# engine = ql.FDDividendAmericanEngine(bs_process, timeSteps=500, gridPoints=500)
american_option.setPricingEngine(engine)

print(american_option.NPV())

Tengo 11,273456 como valor de la opción. Sin embargo, cuando intento cambiar el precio al contado, o la fecha de cálculo y volver a valorar la opción, el VAN no parece cambiar.

Lo intenté:

spot_handle.setValue = 179
print(american_option.NPV())

o

ql.Settings.instance().evaluationDate = calculation_date + 1
print(american_option.NPV())

El VAN sigue dando el mismo valor, a menos que vuelva a ejecutar el código de la primera sección para volver a crear el instrumento con nuevas entradas. Pensaba que Quantlib está diseñado para permitirnos utilizar el instrumento existente para revalorizarlo simplemente cambiando una o más entradas, ¿me he perdido algo?

Gracias por su ayuda.

3voto

tralston Puntos 76

¡Hola aficionado y bienvenido a SE! Usted estaba muy cerca, hay dos pequeños problemas con su código:

setValue()

Este es un método y no un atributo cuyo valor se puede actualizar, por lo que hay que llamar a object.setValue(new_value) en lugar de object.setValue = new_value

Asas y comillas

El mango es más o menos un puntero inteligente en un puntero, apunta en una cita que puede cambiar.

Como resultado, no es el valor de la manija lo que necesita cambiar (y por cierto, no tiene un setValue() se puede ver si se llama a spot_handle.setValue(179) ).

Lo que puede cambiar en cambio es el valor de la comilla subyacente, de esta manera:

(...)
spot = ql.SimpleQuote(spot_price)
spot_handle = ql.QuoteHandle(spot)
(...)
print(american_option.NPV())
# Returns 11.273456139007127

spot.setValue(179.)
print(american_option.NPV())
# Returns 10.747540028959339

Para más información sobre las asas:

0 votos

Muchas gracias, me ha servido. También encontré esto sobre el cambio de la fecha de valoración: stackoverflow.com/questions/41471675/

0 votos

Otra cuestión aquí, si tengo: dividenddates = [ql.Date(2,8,2018), ql.Date(8, 11, 2018)] en el ejemplo anterior, significa ir ex mañana. Cuando muevo la fecha de evaluación 1 día hacia adelante, NPV() da un error "la primera fecha (....) no puede ser negativa", ¿alguna pista sobre esto? ¿Hay alguna forma mejor de manejar el bloque de dividendos como entrada? Gracias.

0 votos

Hola fan. Si te ha funcionado, acepta la respuesta. Para tu última pregunta, el problema es que la primera fecha de tu curva está en el pasado. Tienes que establecer tu curva utilizando una fecha de referencia que sea relativa a la fecha de cálculo y no una fecha fija, por ejemplo flat_ts = ql.YieldTermStructureHandle(ql.FlatForward(0, calendar, risk_free_rate, day_count)) ver aquí: stackoverflow.com/a/41473711/2699660

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X