68 lines
2.3 KiB
C#
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>();
|
|
}
|
|
}
|
|
}
|