58 lines
1.8 KiB
C#
58 lines
1.8 KiB
C#
using KLHZ.Trader.Core.Contracts.Declisions.Dtos;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
|
{
|
|
public static class Statistics
|
|
{
|
|
|
|
public static decimal Mean(this CachedValue[] values)
|
|
{
|
|
return values.Sum(x => x.Value)/ values.Length;
|
|
}
|
|
|
|
private static (decimal mean, decimal std) CaclSigma(decimal[] values)
|
|
{
|
|
var mean = values.Sum() / values.Length;
|
|
var data = new decimal[values.Length];
|
|
Array.Copy(values, data, data.Length);
|
|
for (int i = 0; i < data.Length; i++)
|
|
{
|
|
var v = data[i] - mean;
|
|
data[i] = v * v;
|
|
}
|
|
var std = System.Math.Pow((double)(data.Sum() / (data.Length - 1)), 0.5);
|
|
return (mean,(decimal)std);
|
|
}
|
|
|
|
public static decimal[] ClearNSigmaReqursive(decimal[] values, int depth = 0, int sigmasCount = 3)
|
|
{
|
|
if (values.Length <= 1 || depth>10) return values;
|
|
var sigmaRes = CaclSigma(values);
|
|
var std = sigmaRes.std;
|
|
var mean = sigmaRes.mean;
|
|
var forRes = new List<decimal>();
|
|
var _3std = sigmasCount * std;
|
|
foreach (var v in values)
|
|
{
|
|
if (System.Math.Abs(mean - v)< _3std)
|
|
{
|
|
forRes.Add(v);
|
|
}
|
|
}
|
|
if (forRes.Count != values.Length)
|
|
{
|
|
return ClearNSigmaReqursive(forRes.ToArray(), depth+1);
|
|
}
|
|
else
|
|
{
|
|
return forRes.ToArray();
|
|
}
|
|
}
|
|
}
|
|
}
|