나의 이해 날을 진행하기 위해, 당신은 같은 것을 할 것입니다 옵션 :Quantlib
import QuantLib as ql
# option data
maturity_date = ql.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 = ql.Option.Call
risk_free_rate = 0.001
day_count = ql.Actual365Fixed()
#calendar = ql.UnitedStates()
calendar = ql.TARGET()
calculation_date = ql.Date(8, 5, 2015)
ql.Settings.instance().evaluationDate = calculation_date
# construct the European Option
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
exercise = ql.EuropeanExercise(maturity_date)
european_option = ql.VanillaOption(payoff, exercise)
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)
)
bsm_process = ql.BlackScholesMertonProcess(spot_handle,
dividend_yield,
flat_ts,
flat_vol_ts)
european_option.setPricingEngine(ql.AnalyticEuropeanEngine(bsm_process))
bs_price = european_option.NPV()
print "The theoretical European price is ", bs_price
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
settlement = calculation_date
am_exercise = ql.AmericanExercise(settlement, maturity_date)
american_option = ql.VanillaOption(payoff, am_exercise)
#Once you have the american option object you can value them using the binomial tree method:
binomial_engine = ql.BinomialVanillaEngine(bsm_process, "crr", 100)
american_option.setPricingEngine(binomial_engine)
print "The theoretical American price is ", american_option.NPV()
ql.Settings.instance().evaluation_date = calculation_date + 1
print "The theoretical European price is ", european_option.NPV()
print "The theoretical American price is ", american_option.NPV()
[[email protected] python]$ python european_option.py
The theoretical European price is 6.74927181246
The theoretical American price is 6.85858045945
The theoretical European price is 6.74927181246
The theoretical American price is 6.85858045945
[[email protected] python]$
편집
아래의 제안에 따라에 코드를 변경하지만, 일의 변화는 computat에서 차이가 없습니다 이온.
[[email protected] python]$ python advance_day.py
The theoretical European price is 6.74927181246
The theoretical American price is 6.85858045945
The theoretical European price is 6.74927181246
The theoretical American price is 6.85858045945
[[email protected] python]$
다음은 제안에 따른 코드 변경 사항입니다.
import QuantLib as ql
# option data
maturity_date = ql.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 = ql.Option.Call
risk_free_rate = 0.001
day_count = ql.Actual365Fixed()
#calendar = ql.UnitedStates()
calendar = ql.TARGET()
calculation_date = ql.Date(8, 5, 2015)
ql.Settings.instance().evaluationDate = calculation_date
# construct the European Option
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
exercise = ql.EuropeanExercise(maturity_date)
european_option = ql.VanillaOption(payoff, exercise)
spot_handle = ql.QuoteHandle(
ql.SimpleQuote(spot_price)
)
flat_ts = ql.YieldTermStructureHandle(
ql.FlatForward(0, calendar, risk_free_rate, day_count)
)
dividend_yield = ql.YieldTermStructureHandle(
ql.FlatForward(0, calendar, dividend_rate, day_count)
)
flat_vol_ts = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(0, calendar, volatility, day_count)
)
bsm_process = ql.BlackScholesMertonProcess(spot_handle,
dividend_yield,
flat_ts,
flat_vol_ts)
european_option.setPricingEngine(ql.AnalyticEuropeanEngine(bsm_process))
bs_price = european_option.NPV()
print "The theoretical European price is ", bs_price
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
settlement = calculation_date
am_exercise = ql.AmericanExercise(settlement, maturity_date)
american_option = ql.VanillaOption(payoff, am_exercise)
#Once you have the american option object you can value them using the binomial tree method:
binomial_engine = ql.BinomialVanillaEngine(bsm_process, "crr", 100)
american_option.setPricingEngine(binomial_engine)
print "The theoretical American price is ", american_option.NPV()
ql.Settings.instance().evaluation_date = calculation_date + 1
# Also tried calendar.advance(calculation_date,1,ql.Days)
print "The theoretical European price is ", european_option.NPV()
print "The theoretical American price is ", american_option.NPV()
나는 따르고 있지 않습니다. 원래 게시물의 EDIT 섹션을 참조하십시오. 하루 전진 전후의 결과는 같습니다. – Ivan
새 날짜를 설정할 때'evaluation_date'가 아니라'evaluationDate' 여야합니다. 나는 처음으로 그것을 놓쳤다. 불행히도 파이썬은 단지 새로운 속성을 추가하고 있다는 경고를하지 않습니다 ... 그러나 커브의 참조 날짜를 고치지 않는 것에 대한 문제는 여전히 적용됩니다. 원본 스크립트에서는 옵션 값이 변경되지 않습니다. –
나는 그것을 작동시켰다. 감사! – Ivan