/// <summary> /// Calculate forward price, discount factor and volatility. /// </summary> protected override void PriceAndVolatility(double baseDate, double valueDate, Vector forwardPrice, Vector discountFactor, Vector volatility) { CommodityFutureOption deal = (CommodityFutureOption)Deal; double t = CalcUtils.DaysToYears(valueDate - baseDate); double tSettle = CalcUtils.DaysToYears(deal.Settlement_Date - baseDate); // Get spot price in contract currency forwardPrice.Assign(fCommodityPrice.Get(t) / fFxRate.Get(t)); if (volatility != null) { double tExpiry = CalcUtils.DaysToYears(deal.Expiry_Date - baseDate); if (tExpiry > t) { // temporary use of discountFactor vector to store strike discountFactor.Assign(deal.Strike); // Get volatility using spot price and strike volatility.Assign(fCommodityPriceVol.Get(t, forwardPrice, discountFactor, tExpiry)); } else { volatility.Clear(); } } fDiscountRate.GetValue(discountFactor, t, tSettle); // Get forward factor and complete calculation of forward price forwardPrice.MultiplyBy(fCommodityPrice.ForwardFactor(t, tSettle, fFxRate)); }
/// <summary> /// Prepare for valuation anything that is dependent upon the scenario. /// </summary> public override void PreValue(PriceFactorList factors) { base.PreValue(factors); CommodityFutureOption deal = (CommodityFutureOption)Deal; deal.GetCommodityDealHelper().PreValueAsset(out fCommodityPrice, out fCommodityPriceVol, factors); }
/// <summary> /// Register price factors. /// </summary> public override void RegisterFactors(PriceFactorList factors, ErrorList errors) { base.RegisterFactors(factors, errors); CommodityFutureOption deal = (CommodityFutureOption)Deal; deal.GetCommodityDealHelper().RegisterFactors(factors, errors); }