using Qdp.Pricing.Base.Enums; using System.Text.RegularExpressions; namespace YLErp.Model { public class SpreadOptionPayoff { private static Regex pattern = new Regex(@"(?[\+-]?)(?\d+(?:\.\d*)?)?([Ss])(\w+)"); public SpreadOptionPayoff(string payoff) { this.Payoff = payoff; parsePayoff(); } public string Payoff { get; set; } private SpreadType _spreadType; public SpreadType SpreadType { get { return _spreadType; } } private double[] _weights; public double[] Weights { get { return _weights; } } /** * TwoAssetsSpread max(S1-S2-K, 0) * ThreeAssetsSpread max(S1-S2-S3-K, 0) * ThreeAssetsSpreadBasket max(S1+S2-S3-K, 0) * FourAssetsSpread max(S1-S2-S3-S4-K, 0) * FourAssetsSpreadBasketType1 max(S1+S2-S3-S4-K, 0) * FourAssetsSpreadBasketType2 max(S1+S2+S3-S4-K, 0) */ public void parsePayoff() { var mc = pattern.Matches(Payoff); if (mc.Count < 2 || mc.Count > 4) { throw new ArgumentException(String.Format("不合法的payoff: {0}", Payoff)); } _spreadType = SpreadType.TwoAssetsSpread; if (mc.Count == 3) { var sign = mc[1].Groups["sign"].Value; _spreadType = "-".Equals(sign) ? SpreadType.ThreeAssetsSpread : SpreadType.ThreeAssetsSpreadBasket; } else if (mc.Count == 4) { var sign1 = mc[1].Groups["sign"].Value; var sign2 = mc[2].Groups["sign"].Value; if ("-".Equals(sign1)) { _spreadType = SpreadType.FourAssetsSpread; } else if ("-".Equals(sign2)) { _spreadType = SpreadType.FourAssetsSpreadBasketType1; } else { _spreadType = SpreadType.FourAssetsSpreadBasketType2; } } _weights = mc.Cast().Select(m => { var w = m.Groups["weight"].Value; return w.Length == 0 ? 1.0 : Double.Parse(w); }).ToArray(); } } }