Files
zszq-trs/YLErpDAL/Model/SpreadOptionPayoff.cs
T
2024-05-09 14:06:26 +08:00

68 lines
2.3 KiB
C#

using Qdp.Pricing.Base.Enums;
using System.Text.RegularExpressions;
namespace YLErp.Model
{
public class SpreadOptionPayoff
{
private static Regex pattern = new Regex(@"(?<sign>[\+-]?)(?<weight>\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<Match>().Select(m =>
{
var w = m.Groups["weight"].Value;
return w.Length == 0 ? 1.0 : Double.Parse(w);
}).ToArray<double>();
}
}
}