public static Greeks GetOptionOnFutureGreeks(double underlyingPrice, double strike, double riskFreeRate, DateTime expirationDate, DateTime calculationDate, string optionType, string exerciseType, double optionPrice = double.NaN, double impliedVol = 0.15, string engineName = "baw") { QLNet.Date ExpirationDateObj = new QLNet.Date(expirationDate.Day, expirationDate.Month, expirationDate.Year); QLNet.Date CalculationDateObj = new QLNet.Date(calculationDate.Day, calculationDate.Month, calculationDate.Year); QLNet.DayCounter DayCountObj = new QLNet.Actual365Fixed(); QLNet.Calendar CalendarObj = new QLNet.UnitedStates(); Greeks GreeksOutput = new Greeks(); QLNet.Option.Type OptionTypeObj; QLNet.Exercise ExerciseObj; double ImpliedVol; double OptionPrice; int CalDte = DayCountObj.dayCount(CalculationDateObj, ExpirationDateObj); GreeksOutput.CalDte = CalDte; if (!double.IsNaN(optionPrice)) { if (optionType.ToUpper() == "C") { if (optionPrice + strike - underlyingPrice <= 1.0e-12) { GreeksOutput.Delta = 1; return(GreeksOutput); } } else if (optionType.ToUpper() == "P") { if (optionPrice - strike + underlyingPrice <= 1.0e-12) { GreeksOutput.Delta = -1; return(GreeksOutput); } } } if (CalDte == 0) { if (optionType.ToUpper() == "C") { if (strike <= underlyingPrice) { GreeksOutput.Delta = 1; } else { GreeksOutput.Delta = 0; } } else if (optionType.ToUpper() == "P") { if (strike >= underlyingPrice) { GreeksOutput.Delta = -1; } else { GreeksOutput.Delta = 0; } } return(GreeksOutput); } if (optionType.ToUpper() == "C") { OptionTypeObj = QLNet.Option.Type.Call; } else if (optionType.ToUpper() == "P") { OptionTypeObj = QLNet.Option.Type.Put; } else { return(GreeksOutput); } if (exerciseType.ToUpper() == "E") { ExerciseObj = new QLNet.EuropeanExercise(ExpirationDateObj); } else if (exerciseType.ToUpper() == "A") { ExerciseObj = new QLNet.AmericanExercise(CalculationDateObj, ExpirationDateObj); } else { return(GreeksOutput); } QLNet.Settings.setEvaluationDate(CalculationDateObj); QLNet.Handle <Quote> UnderlyingObj = new QLNet.Handle <Quote>(new QLNet.SimpleQuote(underlyingPrice)); QLNet.Handle <YieldTermStructure> FlatRateObj = new QLNet.Handle <YieldTermStructure>(new QLNet.FlatForward(CalculationDateObj, riskFreeRate, DayCountObj)); QLNet.Handle <BlackVolTermStructure> FlatVolTsObj = new QLNet.Handle <BlackVolTermStructure>(new QLNet.BlackConstantVol(CalculationDateObj, CalendarObj, impliedVol, DayCountObj)); QLNet.BlackProcess BlackProc = new QLNet.BlackProcess(UnderlyingObj, FlatRateObj, FlatVolTsObj); QLNet.PlainVanillaPayoff PayoffObj = new QLNet.PlainVanillaPayoff(OptionTypeObj, strike); QLNet.VanillaOption OptionObj = new QLNet.VanillaOption(PayoffObj, ExerciseObj); if (engineName == "baw") { OptionObj.setPricingEngine(new QLNet.BaroneAdesiWhaleyApproximationEngine(BlackProc)); } else if (engineName == "fda") { OptionObj.setPricingEngine(new QLNet.FDAmericanEngine(BlackProc, 100, 100)); } else { return(GreeksOutput); } if (!double.IsNaN(optionPrice)) { try { ImpliedVol = OptionObj.impliedVolatility(targetValue: optionPrice, process: BlackProc, accuracy: 1e-5); } catch { return(GreeksOutput); } FlatVolTsObj = new QLNet.Handle <BlackVolTermStructure>(new QLNet.BlackConstantVol(CalculationDateObj, CalendarObj, ImpliedVol, DayCountObj)); BlackProc = new QLNet.BlackProcess(UnderlyingObj, FlatRateObj, FlatVolTsObj); if (engineName == "baw") { OptionObj.setPricingEngine(new QLNet.BaroneAdesiWhaleyApproximationEngine(BlackProc)); } else if (engineName == "fda") { OptionObj.setPricingEngine(new QLNet.FDAmericanEngine(BlackProc, 100, 100)); } OptionPrice = optionPrice; } else { OptionPrice = OptionObj.NPV(); ImpliedVol = impliedVol; } OptionObj = new QLNet.VanillaOption(PayoffObj, new QLNet.EuropeanExercise(ExpirationDateObj)); OptionObj.setPricingEngine(new QLNet.AnalyticEuropeanEngine(BlackProc)); GreeksOutput.Delta = OptionObj.delta(); GreeksOutput.Vega = OptionObj.vega(); GreeksOutput.Theta = OptionObj.thetaPerDay(); GreeksOutput.Gamma = OptionObj.gamma(); GreeksOutput.OptionPrice = OptionPrice; GreeksOutput.ImpliedVol = ImpliedVol; return(GreeksOutput); }
public static Greeks GetOptionOnFutureGreeks(double underlyingPrice,double strike,double riskFreeRate, DateTime expirationDate, DateTime calculationDate, string optionType, string exerciseType, double optionPrice=double.NaN,double impliedVol=0.15,string engineName="baw") { QLNet.Date ExpirationDateObj = new QLNet.Date(expirationDate.Day, expirationDate.Month, expirationDate.Year); QLNet.Date CalculationDateObj = new QLNet.Date(calculationDate.Day, calculationDate.Month, calculationDate.Year); QLNet.DayCounter DayCountObj = new QLNet.Actual365Fixed(); QLNet.Calendar CalendarObj = new QLNet.UnitedStates(); Greeks GreeksOutput = new Greeks(); QLNet.Option.Type OptionTypeObj; QLNet.Exercise ExerciseObj; double ImpliedVol; double OptionPrice; int CalDte = DayCountObj.dayCount(CalculationDateObj, ExpirationDateObj); GreeksOutput.CalDte = CalDte; if (!double.IsNaN(optionPrice)) { if (optionType.ToUpper() == "C") { if (optionPrice + strike - underlyingPrice <= 1.0e-12) { GreeksOutput.Delta = 1; return GreeksOutput; } } else if (optionType.ToUpper() == "P") { if (optionPrice - strike + underlyingPrice <= 1.0e-12) { GreeksOutput.Delta = -1; return GreeksOutput; } } } if (CalDte == 0) { if (optionType.ToUpper() == "C") { if (strike <= underlyingPrice) { GreeksOutput.Delta = 1; } else { GreeksOutput.Delta = 0; } } else if (optionType.ToUpper() == "P") { if (strike >= underlyingPrice) { GreeksOutput.Delta = -1; } else { GreeksOutput.Delta = 0; } } return GreeksOutput; } if (optionType.ToUpper() == "C") { OptionTypeObj = QLNet.Option.Type.Call; } else if (optionType.ToUpper() == "P") { OptionTypeObj = QLNet.Option.Type.Put; } else { return GreeksOutput; } if (exerciseType.ToUpper() == "E") { ExerciseObj = new QLNet.EuropeanExercise(ExpirationDateObj); } else if (exerciseType.ToUpper() == "A") { ExerciseObj = new QLNet.AmericanExercise(CalculationDateObj, ExpirationDateObj); } else { return GreeksOutput; } QLNet.Settings.setEvaluationDate(CalculationDateObj); QLNet.Handle<Quote> UnderlyingObj = new QLNet.Handle<Quote>(new QLNet.SimpleQuote(underlyingPrice)); QLNet.Handle<YieldTermStructure> FlatRateObj = new QLNet.Handle<YieldTermStructure>(new QLNet.FlatForward(CalculationDateObj, riskFreeRate, DayCountObj)); QLNet.Handle<BlackVolTermStructure> FlatVolTsObj = new QLNet.Handle<BlackVolTermStructure>(new QLNet.BlackConstantVol(CalculationDateObj, CalendarObj, impliedVol, DayCountObj)); QLNet.BlackProcess BlackProc = new QLNet.BlackProcess(UnderlyingObj, FlatRateObj, FlatVolTsObj); QLNet.PlainVanillaPayoff PayoffObj = new QLNet.PlainVanillaPayoff(OptionTypeObj, strike); QLNet.VanillaOption OptionObj = new QLNet.VanillaOption(PayoffObj, ExerciseObj); if (engineName == "baw") { OptionObj.setPricingEngine(new QLNet.BaroneAdesiWhaleyApproximationEngine(BlackProc)); } else if (engineName == "fda") { OptionObj.setPricingEngine(new QLNet.FDAmericanEngine(BlackProc, 100, 100)); } else { return GreeksOutput; } if (!double.IsNaN(optionPrice)) { try { ImpliedVol = OptionObj.impliedVolatility(targetValue:optionPrice, process:BlackProc,accuracy:1e-5); } catch { return GreeksOutput; } FlatVolTsObj = new QLNet.Handle<BlackVolTermStructure>(new QLNet.BlackConstantVol(CalculationDateObj, CalendarObj, ImpliedVol, DayCountObj)); BlackProc = new QLNet.BlackProcess(UnderlyingObj, FlatRateObj, FlatVolTsObj); if (engineName == "baw") { OptionObj.setPricingEngine(new QLNet.BaroneAdesiWhaleyApproximationEngine(BlackProc)); } else if (engineName == "fda") { OptionObj.setPricingEngine(new QLNet.FDAmericanEngine(BlackProc, 100, 100)); } OptionPrice = optionPrice; } else { OptionPrice = OptionObj.NPV(); ImpliedVol = impliedVol; } OptionObj = new QLNet.VanillaOption(PayoffObj, new QLNet.EuropeanExercise(ExpirationDateObj)); OptionObj.setPricingEngine(new QLNet.AnalyticEuropeanEngine(BlackProc)); GreeksOutput.Delta = OptionObj.delta(); GreeksOutput.Vega = OptionObj.vega(); GreeksOutput.Theta = OptionObj.thetaPerDay(); GreeksOutput.Gamma = OptionObj.gamma(); GreeksOutput.OptionPrice = OptionPrice; GreeksOutput.ImpliedVol = ImpliedVol; return GreeksOutput; }
public double calculateImpl(DateTime calcDate, FP_Parameter fp_parameter) { List<QLNet.CashFlow> ql_fixedCFList = new List<QLNet.CashFlow>(); List<QLNet.CashFlow> ql_floatingCFList = new List<QLNet.CashFlow>(); foreach (FP_CashFlow fixed_cf in this.FixedLegInfo_.FP_CashFlowList_) { ql_fixedCFList.Add(fixed_cf.build_ql_cf(fp_parameter)); } foreach (FP_CashFlow floating_cf in this.FloatingLegInfo_.FP_CashFlowList_) { ql_floatingCFList.Add(floating_cf.build_ql_cf(fp_parameter)); } Swap ql_swap = new Swap(ql_fixedCFList, ql_floatingCFList); //QLNet.DiscountingBasisSwapEngine Handle<YieldTermStructure> ql_discount_ts //= new QLNet.Handle<YieldTermStructure>(fp_parameter.DiscountCurveMap_["KRW"]); = new QLNet.Handle<YieldTermStructure>(fp_parameter.getDiscountCurve("KRW")); QLNet.DiscountingSwapEngine engine = new DiscountingSwapEngine(ql_discount_ts); ql_swap.setPricingEngine(engine); #region Result Price/Greek //clsHITM_FP_GREEKRESULT_TB clstb_greekresult = new clsHITM_FP_GREEKRESULT_TB(); //clsHDAT_MARKETDATA_TB clstb_market = new clsHDAT_MARKETDATA_TB(); //clstb_market.REF_DT = calcDate.ToString("yyyyMMdd"); double swap_price = ql_swap.NPV(); #region Comment //foreach (var item in index_cdList) //{ // clstb_market.INDEX_CD = item; // clstb_market.SelectOwn(); // clstb_greekresult.FP_GREEKRESULT_ID = ""; // clstb_greekresult.CALC_DT = calcDate.ToString("yyyyMMdd"); // clstb_greekresult.INSTRUMENT_ID = this.SwapDAO_.INSTRUMENT_ID; // clstb_greekresult.INSTRUMENT_TYP = 0; // clstb_greekresult.UNDERLYING_ID = item; // clstb_greekresult.UNDERLYING_VALUE = clstb_market.LAST; // clstb_greekresult.SEQ = count; // clstb_greekresult.DELTA = 0.0; // clstb_greekresult.GAMMA = 0.0; // clstb_greekresult.VEGA = 0.0; // if (count == 1) { clstb_greekresult.CALC_PRICE = swap_price; } // else { clstb_greekresult.CALC_PRICE = 0.0; } // clstb_greekresult.CALCULATED_FLAG = 1; // clstb_greekresult.CALCULATED_TIME = DateTime.Now.ToString("HHmmss"); // clstb_greekresult.CALCULATE_TYP = 1; // 패러럴 쉬푸투 or 그냥 구한거 머 등등.. // clstb_greekresult.Insert(); // count += 1; //} #endregion #endregion for (int i = 0; i < this.FixedLegInfo_.FP_CashFlowList_.Count; i++) { this.FixedLegInfo_.FP_CashFlowList_[i].CashFlowAmount_ = ql_fixedCFList[i].amount(); this.FixedLegInfo_.FP_CashFlowList_[i].DiscountFactor_ = ql_discount_ts.currentLink().discount(this.FixedLegInfo_.FP_CashFlowList_[i].PaymentDate_); } for (int j = 0; j < this.FloatingLegInfo_.FP_CashFlowList_.Count; j++) { this.FloatingLegInfo_.FP_CashFlowList_[j].CashFlowAmount_ = ql_floatingCFList[j].amount(); this.FloatingLegInfo_.FP_CashFlowList_[j].DiscountFactor_ = ql_discount_ts.currentLink().discount(this.FloatingLegInfo_.FP_CashFlowList_[j].PaymentDate_); } return swap_price; //#endregion }