Browse Source

Addition of Financial bases absolute risk stats

Addition of stats and unit tests.  Still need test for GainLossRatio.
The tests may be a bit sparse compared to what is required for a pull.
Will need to talk to Chrisoph about that.
v2
Phil 14 years ago
parent
commit
28f025e23b
  1. 198
      src/Numerics/Financial/AbsoluteRiskStatistics.cs
  2. 1
      src/Numerics/Numerics.csproj
  3. 113
      src/UnitTests/FinancialTests/DownsideDeviationTests.cs
  4. 42
      src/UnitTests/FinancialTests/GainLossRatioTests.cs
  5. 105
      src/UnitTests/FinancialTests/GainMeanTests.cs
  6. 119
      src/UnitTests/FinancialTests/GainStandardDeviationTests.cs
  7. 105
      src/UnitTests/FinancialTests/LossMeanTests.cs
  8. 117
      src/UnitTests/FinancialTests/LossStandardDeviationTests.cs
  9. 108
      src/UnitTests/FinancialTests/SemiDeviationTests.cs
  10. 6
      src/UnitTests/UnitTests.csproj

198
src/Numerics/Financial/AbsoluteRiskStatistics.cs

@ -0,0 +1,198 @@
// <copyright file="AbsoluteRiskStatistics.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
//
// Copyright (c) 2009-2010 Math.NET
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.Financial
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathNet.Numerics.Statistics;
public static class AbsoluteRiskStatistics
{
//Note: The following statistics would be condidered an absolute risk statistic in the finance realm as well.
// Standard Deviation
// Annualized Standard Deviation = Math.Sqrt(Monthly Standard Deviation x ( 12 ))
// Skewness
// Kurtosis
/// <summary>
/// Calculation is similar to Standard Deviation , except it calculates an average (mean) return only for periods with a gain
/// and measures the variation of only the gain periods around the gain mean. Measures the volatility of upside performance.
/// © Copyright 1996, 1999 Gary L.Gastineau. First Edition. © 1992 Swiss Bank Corporation.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static double GainStandardDeviation(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var gains = data.Where(x => x >= 0);
var count = gains.Count();
if (count == 0 || count == 1)
return double.NaN;
return gains.StandardDeviation();
}
/// <summary>
/// Similar to standard deviation, except this statistic calculates an average (mean) return for only the periods with a loss and then
/// measures the variation of only the losing periods around this loss mean. This statistic measures the volatility of downside performance.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
/// <remarks>http://www.offshore-library.com/kb/statistics.php</remarks>
public static double LossStandardDeviation(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var losses = data.Where(x => x < 0);
var count = losses.Count();
if (count == 0 || count == 1)
return double.NaN;
return losses.StandardDeviation();
}
/// <summary>
/// This measure is similar to the loss standard deviation except the downside deviation
/// considers only returns that fall below a defined minimum acceptable return (MAR) rather than the arithmetic mean.
/// For example, if the MAR is 7%, the downside deviation would measure the variation of each period that falls below
/// 7%. (The loss standard deviation, on the other hand, would take only losing periods, calculate an average return for
/// the losing periods, and then measure the variation between each losing return and the losing return average).
/// </summary>
/// <param name="data"></param>
/// <param name="minimalAcceptableReturn"></param>
/// <returns></returns>
public static double DownsideDeviation(this IEnumerable<double> data, double minimalAcceptableReturn)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var belowMARdata = data.Where(x => x < minimalAcceptableReturn);
var count = belowMARdata.Count();
if (count == 0 || count == 1)
return double.NaN;
return belowMARdata.StandardDeviation();
}
/// <summary>
/// A measure of volatility in returns below the mean. It's similar to standard deviation, but it only
/// looks at periods where the investment return was less than average return.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static double SemiDeviation(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var belowMeanData = data.Where(x => x < data.Mean());
var count = belowMeanData.Count();
if (count == 0 || count == 1)
return double.NaN;
return belowMeanData.StandardDeviation();
}
/// <summary>
/// Average Gain or Gain Mean
/// This is a simple average (arithmetic mean) of the periods with a gain. It is calculated by summing the returns for gain periods (return 0)
/// and then dividing the total by the number of gain periods.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
/// <remarks>http://www.offshore-library.com/kb/statistics.php</remarks>
public static double GainMean(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var gains = data.Where(x => x >= 0);
return gains.Mean();
}
/// <summary>
/// Average Loss or LossMean
/// This is a simple average (arithmetic mean) of the periods with a loss. It is calculated by summing the returns for loss periods (return < 0)
/// and then dividing the total by the number of loss periods.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
/// <remarks>http://www.offshore-library.com/kb/statistics.php</remarks>
public static double LossMean(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var losses = data.Where(x => x < 0);
return losses.Mean();
}
/// <summary>
/// Measures a fund’s average gain in a gain period divided by the fund’s average loss in a losing
/// period. Periods can be monthly or quarterly depending on the data frequency.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static double GainLossRatio(this IEnumerable<double> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var gains = data.Where(x => x >= 0);
var losses = data.Where(x => x < 0);
var lossMean = losses.Mean();
if(lossMean != 0.0)
return Math.Abs(gains.Mean() / losses.Mean());
return 0.0;
}
}
}

1
src/Numerics/Numerics.csproj

@ -105,6 +105,7 @@
<Compile Include="Constants.cs" />
<Compile Include="Control.cs" />
<Compile Include="Complex32.cs" />
<Compile Include="Financial\AbsoluteRiskStatistics.cs" />
<Compile Include="LinearAlgebra\Generic\Matrix.BCL.cs" />
<Compile Include="LinearAlgebra\Generic\Vector.BCL.cs" />
<Compile Include="SpecialFunctions\Evaluate.cs" />

113
src/UnitTests/FinancialTests/DownsideDeviationTests.cs

@ -0,0 +1,113 @@
// <copyright file="DownsideDeviationTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class DownsideDeviationTests
{
[Test]
public void returns_undefined_with_no_input_data()
{
//arrange
const double minimumAcceptableReturn = 0.05;
var inputData = new List<double>();
//act
var dsDeviation = inputData.DownsideDeviation(minimumAcceptableReturn);
//assert
Assert.AreEqual(double.NaN, dsDeviation);
}
[Test]
public void returns_undefined_with_single_positive_input()
{
//arrange
const double minimumAcceptableReturn = 0.05;
var inputData = new[] { 1.0 };
//act
var dsDeviation = inputData.DownsideDeviation(minimumAcceptableReturn);
//assert
Assert.AreEqual(double.NaN, dsDeviation);
}
[Test]
public void returns_undefined_with_single_negative_input()
{
//arrange
const double minimumAcceptableReturn = 0.05;
var inputData = new[] { -1.0 };
//act
var dsDeviation = inputData.DownsideDeviation(minimumAcceptableReturn);
//assert
Assert.AreEqual(double.NaN, dsDeviation);
}
[Test]
public void only_uses_data_points_below_the_minimum_acceptable_return()
{
//arrange
const double minimumAcceptableReturn = 0.05;
var inputData = new[] { 0.0021, 0.02, 0.5, 0.12 };
var expectedSemiDeviation = inputData.Where(x => x < minimumAcceptableReturn).StandardDeviation();
//act
var semiDeviation = inputData.DownsideDeviation(minimumAcceptableReturn);
//assert
Assert.AreEqual(expectedSemiDeviation, semiDeviation);
}
[Test]
public void handles_negative_values()
{
//arrange
const double minimumAcceptableReturn = 0.05;
var inputData = new[] { -0.1, -0.02, 0.4, 0.12 };
var expectedSemiDeviation = inputData.Where(x => x < minimumAcceptableReturn).StandardDeviation();
//act
var semiDeviation = inputData.DownsideDeviation(minimumAcceptableReturn);
//assert
Assert.AreEqual(expectedSemiDeviation, semiDeviation);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))] //assert
public void throws_when_input_data_is_null()
{
//arrange
const double minimumAcceptableReturn = 0.05;
List<double> inputData = null;
//act
inputData.DownsideDeviation(minimumAcceptableReturn);
}
}
}

42
src/UnitTests/FinancialTests/GainLossRatioTests.cs

@ -0,0 +1,42 @@
// <copyright file="GainLossRatioTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class GainLossRatioTests
{
}
}

105
src/UnitTests/FinancialTests/GainMeanTests.cs

@ -0,0 +1,105 @@
// <copyright file="GainMeanTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class GainMeanTests
{
[Test]
public void returns_zero_when_its_the_only_data()
{
//arrange
var inputData = new[] { 0.0 };
//act
var gainMean = inputData.GainMean();
//assert
Assert.AreEqual(0.0, gainMean);
}
[Test]
public void returns_zero_when_all_input_is_negative()
{
//arrange
var inputData = new[] { -1.0, -2.0, -3.0 };
//act
var gainMean = inputData.GainMean();
//assert
Assert.AreEqual(0.0, gainMean);
}
[Test]
public void returns_same_as_mean_when_all_values_are_positive()
{
//arrange
var inputData = new[] { 1.0, 2.0, 3.0 };
var mean = inputData.Mean();
//act
var gainMean = inputData.GainMean();
//assert
Assert.AreEqual(mean, gainMean);
}
[Test]
public void does_not_use_negative_input_values()
{
//arrange
var inputData = new[] { 1.0, -1.0 };
//act
var gainMean = inputData.GainMean();
//assert
Assert.AreEqual(1.0, gainMean);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void throws_when_input_data_is_null() //assert
{
//arrange
var inputData = new[] { 1.0 };
inputData = null;
//act
inputData.GainMean();
}
[Test]
public void returns_zero_with_no_input_data()
{
//arrange
var inputData = new List<double>();
//act
var gainMean = inputData.GainMean();
//assert
Assert.AreEqual(0.0, gainMean);
}
}
}

119
src/UnitTests/FinancialTests/GainStandardDeviationTests.cs

@ -0,0 +1,119 @@
// <copyright file="GainStandardDeviationTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class GainStandardDeviationTests
{
[Test]
public void returns_undefined_with_no_input_data()
{
//arrange
var inputData = new List<double>();
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(double.NaN, gainStdDev);
}
[Test]
public void returns_undefined_with_single_positive_input()
{
//arrange
var inputData = new[] { 1.0 };
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(double.NaN, gainStdDev);
}
[Test]
public void returns_undefined_with_single_negative_input()
{
//arrange
var inputData = new[] { -1.0 };
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(double.NaN, gainStdDev);
}
[Test]
public void does_not_use_negative_input_data()
{
//arrange
var inputData = new[] { -1.0, 1.0, -2.0, 2.0 };
var expectedGainStdDeviation = inputData.Where(x => x >= 0).StandardDeviation();
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(expectedGainStdDeviation, gainStdDev);
}
[Test]
public void returns_undefined_for_a_set_of_all_negative_numbers()
{
//arrange
var inputData = new[] { -1.0, -1.0, -2.0, -3.0 };
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(double.NaN, gainStdDev);
}
[Test]
public void handles_zero_in_the_data_input_as_a_positive_number()
{
//arrange
var inputData = new[] { -1.0, 0.0, 1.0, 2.0 };
var expectedGainStdDeviation = inputData.Where(x => x >= 0).StandardDeviation();
//act
var gainStdDev = inputData.GainStandardDeviation();
//assert
Assert.AreEqual(expectedGainStdDeviation, gainStdDev);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))] //assert
public void throws_when_input_data_is_null()
{
//arrange
List<double> inputData = null;
//act
inputData.GainStandardDeviation();
}
public double gainStdDev { get; set; }
}
}

105
src/UnitTests/FinancialTests/LossMeanTests.cs

@ -0,0 +1,105 @@
// <copyright file="LossMeanTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class LossMeanTests
{
[Test]
public void returns_zero_when_zero_is_the_only_input()
{
//arrange
var inputData = new[] { 0.0 };
//act
var lossMean = inputData.LossMean();
//assert
Assert.AreEqual(0.0, lossMean);
}
[Test]
public void returns_zero_when_all_input_is_positive()
{
//arrange
var inputData = new[] { 1.0 };
//act
var lossMean = inputData.LossMean();
//assert
Assert.AreEqual(0.0, lossMean);
}
[Test]
public void returns_the_same_as_mean_when_all_values_are_negative()
{
//arrange
var inputData = new[] { -1.0, -2.0 };
var mean = inputData.Mean();
//act
var lossMean = inputData.LossMean();
//assert
Assert.AreEqual(mean, lossMean);
}
[Test]
public void does_not_use_positive_input_values()
{
//arrange
var inputData = new[] { -1.0, 2.0 };
//act
var lossMean = inputData.LossMean();
//assert
Assert.AreEqual(-1.0, lossMean);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))] //assert
public void throws_when_input_data_is_null()
{
//arrange
List<double> inputData = null;
//act
inputData.LossMean();
}
[Test]
public void returns_zero_with_no_input_data()
{
//arrange
var inputData = new List<double>();
//act
var lossMean = inputData.LossMean();
//assert
Assert.AreEqual(0.0, lossMean);
}
}
}

117
src/UnitTests/FinancialTests/LossStandardDeviationTests.cs

@ -0,0 +1,117 @@
// <copyright file="LossStandardDeviationTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class LossStandardDeviationTests
{
[Test]
public void returns_undefined_with_no_input_data()
{
//arrange
var inputData = new List<double>();
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(double.NaN, lossStdDev);
}
[Test]
public void returns_undefined_with_single_positive_input()
{
//arrange
var inputData = new[] { 1.0 };
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(double.NaN, lossStdDev);
}
[Test]
public void returns_undefined_with_single_negative_input()
{
//arrange
var inputData = new[] { -1.0 };
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(double.NaN, lossStdDev);
}
[Test]
public void does_not_use_positive_input_data()
{
//arrange
var inputData = new[] { -1.0, 1.0, -2.0, 2.0 };
var expectedLossStdDeviation = inputData.Where(x => x < 0).StandardDeviation();
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(expectedLossStdDeviation, lossStdDev);
}
[Test]
public void handles_zero_in_the_data_input_as_a_positive_number()
{
//arrange
var inputData = new[] { -1.0, 0.0, -6.0, 2.0 };
var expectedLossStdDeviation = inputData.Where(x => x < 0).StandardDeviation();
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(expectedLossStdDeviation, lossStdDev);
}
[Test]
public void returns_undefined_for_a_set_of_all_positive_numbers()
{
//arrange
var inputData = new[] { 1.0, 1.0, 2.0, 3.0 };
//act
var lossStdDev = inputData.LossStandardDeviation();
//assert
Assert.AreEqual(double.NaN, lossStdDev);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))] //assert
public void throws_when_input_data_is_null()
{
//arrange
List<double> inputData = null;
//act
inputData.LossStandardDeviation();
}
}
}

108
src/UnitTests/FinancialTests/SemiDeviationTests.cs

@ -0,0 +1,108 @@
// <copyright file="SemiDeviationTests.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
// Copyright (c) 2009-2010 Math.NET
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
namespace MathNet.Numerics.UnitTests.FinancialTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using MathNet.Numerics.Financial;
using MathNet.Numerics.Statistics;
using NUnit.Framework;
[TestFixture]
public class SemiDeviationTests
{
[Test]
public void returns_undefined_with_no_input_data()
{
//arrange
var inputData = new List<double>();
//act
var semiDeviation = inputData.SemiDeviation();
//assert
Assert.AreEqual(double.NaN, semiDeviation);
}
[Test]
public void returns_undefined_with_single_positive_input()
{
//arrange
var inputData = new[] { 1.0 };
//act
var semiDeviation = inputData.SemiDeviation();
//assert
Assert.AreEqual(double.NaN, semiDeviation);
}
[Test]
public void returns_undefined_with_single_negative_input()
{
//arrange
var inputData = new[] { -1.0 };
//act
var semiDeviation = inputData.SemiDeviation();
//assert
Assert.AreEqual(double.NaN, semiDeviation);
}
[Test]
public void only_uses_data_points_below_the_mean_of_all_data()
{
//arrange
var inputData = new[] { 1.0, 2.0, 3.0, 4.0 };
var mean = inputData.Mean();
var expectedSemiDeviation = inputData.Where(x => x < mean).StandardDeviation();
//act
var semiDeviation = inputData.SemiDeviation();
//assert
Assert.AreEqual(expectedSemiDeviation, semiDeviation);
}
[Test]
public void handles_negative_values()
{
//arrange
var inputData = new[] { -1.0, 2.0, 3.0, 4.0 };
var mean = inputData.Mean();
var expectedSemiDeviation = inputData.Where(x => x < mean).StandardDeviation();
//act
var semiDeviation = inputData.SemiDeviation();
//assert
Assert.AreEqual(expectedSemiDeviation, semiDeviation);
}
[Test]
[ExpectedException(typeof(ArgumentNullException))] //assert
public void throws_when_input_data_is_null()
{
//arrange
List<double> inputData = null;
//act
inputData.SemiDeviation();
}
}
}

6
src/UnitTests/UnitTests.csproj

@ -122,6 +122,12 @@
<Compile Include="DistributionTests\Multivariate\MultinomialTests.cs" />
<Compile Include="DistributionTests\Multivariate\NormalGammaTests.cs" />
<Compile Include="DistributionTests\Multivariate\WishartTests.cs" />
<Compile Include="FinancialTests\DownsideDeviationTests.cs" />
<Compile Include="FinancialTests\GainStandardDeviationTests.cs" />
<Compile Include="FinancialTests\LossMeanTests.cs" />
<Compile Include="FinancialTests\GainMeanTests.cs" />
<Compile Include="FinancialTests\LossStandardDeviationTests.cs" />
<Compile Include="FinancialTests\SemiDeviationTests.cs" />
<Compile Include="IntegralTransformsTests\FourierTest.cs" />
<Compile Include="IntegralTransformsTests\HartleyTest.cs" />
<Compile Include="IntegralTransformsTests\InverseTransformTest.cs" />

Loading…
Cancel
Save