mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-22 12:38:06 +00:00
Refactor code formatting and improve consistency across various test files
- Removed unnecessary blank lines in multiple test files to enhance readability. - Ensured consistent spacing and formatting in the `Trima`, `Usf`, `Vidya`, `Wma`, and `Atr` test classes. - Updated comments for clarity and consistency in the `Atr` and `Adl` classes. - Adjusted project files for better structure and maintainability.
This commit is contained in:
@@ -23,7 +23,7 @@ public class VarianceTests
|
||||
// Sample Variance (N-1=7): 32 / 7 = 4.571428...
|
||||
|
||||
var data = new double[] { 2, 4, 4, 4, 5, 5, 7, 9 };
|
||||
|
||||
|
||||
// Test Population Variance
|
||||
var popVar = new Variance(8, isPopulation: true);
|
||||
foreach (var val in data)
|
||||
@@ -46,7 +46,7 @@ public class VarianceTests
|
||||
{
|
||||
int period = 5;
|
||||
var variance = new Variance(period);
|
||||
|
||||
|
||||
for (int i = 0; i < period; i++)
|
||||
{
|
||||
Assert.False(variance.IsHot);
|
||||
@@ -75,18 +75,18 @@ public class VarianceTests
|
||||
{
|
||||
// Test differential update
|
||||
var variance = new Variance(3, isPopulation: true);
|
||||
|
||||
|
||||
// Add 1, 2, 3. Mean=2. Var = ((1-2)^2 + (2-2)^2 + (3-2)^2)/3 = (1+0+1)/3 = 2/3 = 0.666...
|
||||
variance.Update(new TValue(DateTime.UtcNow, 1));
|
||||
variance.Update(new TValue(DateTime.UtcNow, 2));
|
||||
variance.Update(new TValue(DateTime.UtcNow, 3));
|
||||
|
||||
|
||||
Assert.Equal(2.0/3.0, variance.Last.Value, precision: 6);
|
||||
|
||||
// Update last value from 3 to 6.
|
||||
// Data: 1, 2, 6. Mean=3. Var = ((1-3)^2 + (2-3)^2 + (6-3)^2)/3 = (4+1+9)/3 = 14/3 = 4.666...
|
||||
variance.Update(new TValue(DateTime.UtcNow, 6), isNew: false);
|
||||
|
||||
|
||||
Assert.Equal(14.0/3.0, variance.Last.Value, precision: 6);
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ public class VarianceTests
|
||||
int count = 1000;
|
||||
var data = new double[count];
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.05, sigma: 0.2, seed: 123);
|
||||
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
data[i] = gbm.Next().Close;
|
||||
@@ -144,7 +144,7 @@ public class VarianceTests
|
||||
variance.Update(new TValue(DateTime.UtcNow, 1));
|
||||
variance.Update(new TValue(DateTime.UtcNow, 2));
|
||||
variance.Update(new TValue(DateTime.UtcNow, double.NaN));
|
||||
|
||||
|
||||
var result = variance.Last.Value;
|
||||
Assert.True(double.IsNaN(result));
|
||||
}
|
||||
@@ -155,12 +155,12 @@ public class VarianceTests
|
||||
// Run for > 1000 updates to trigger Resync
|
||||
var variance = new Variance(10);
|
||||
var gbm = new GBM(startPrice: 100, mu: 0.05, sigma: 0.2, seed: 123);
|
||||
|
||||
|
||||
for (int i = 0; i < 1100; i++)
|
||||
{
|
||||
variance.Update(new TValue(DateTime.UtcNow, gbm.Next().Close));
|
||||
}
|
||||
|
||||
|
||||
Assert.True(double.IsFinite(variance.Last.Value));
|
||||
Assert.True(variance.Last.Value >= 0);
|
||||
}
|
||||
@@ -174,10 +174,10 @@ public class VarianceTests
|
||||
for (int i = 0; i < count; i++) data[i] = (double)i;
|
||||
|
||||
var series = new TSeries(new System.Collections.Generic.List<long>(new long[count]), new System.Collections.Generic.List<double>(data));
|
||||
|
||||
|
||||
// Batch calculation
|
||||
var batchResult = Variance.Calculate(series, 10);
|
||||
|
||||
|
||||
// Verify last value against streaming
|
||||
var variance = new Variance(10);
|
||||
double lastStreaming = 0;
|
||||
|
||||
@@ -23,14 +23,14 @@ public class VarianceValidationTests
|
||||
// Skender StdDev uses Population Standard Deviation (N) for calculation,
|
||||
// despite documentation often implying Sample (N-1).
|
||||
// Variance(isPopulation: true) should match StdDev^2.
|
||||
|
||||
|
||||
int period = 20;
|
||||
var variance = new Variance(period, isPopulation: true);
|
||||
var skenderStdDev = _data.SkenderQuotes.GetStdDev(period);
|
||||
|
||||
var skenderList = skenderStdDev.ToList();
|
||||
var quotes = _data.SkenderQuotes.ToList();
|
||||
|
||||
|
||||
for (int i = 0; i < quotes.Count; i++)
|
||||
{
|
||||
var tValue = variance.Update(new TValue(quotes[i].Date, (double)quotes[i].Close));
|
||||
@@ -50,7 +50,7 @@ public class VarianceValidationTests
|
||||
// TA-Lib VAR uses Population Variance (N)
|
||||
int period = 20;
|
||||
var variance = new Variance(period, isPopulation: true);
|
||||
|
||||
|
||||
var quotes = _data.SkenderQuotes.ToList();
|
||||
double[] input = quotes.Select(q => (double)q.Close).ToArray();
|
||||
double[] output = new double[input.Length];
|
||||
@@ -78,18 +78,18 @@ public class VarianceValidationTests
|
||||
// Tulip VAR uses Population Variance (N)
|
||||
int period = 20;
|
||||
var variance = new Variance(period, isPopulation: true);
|
||||
|
||||
|
||||
var quotes = _data.SkenderQuotes.ToList();
|
||||
double[] input = quotes.Select(q => (double)q.Close).ToArray();
|
||||
|
||||
|
||||
// Tulip calculation
|
||||
var varInd = Tulip.Indicators.var;
|
||||
double[][] inputs = { input };
|
||||
double[] options = { period };
|
||||
double[][] outputs = { new double[input.Length - varInd.Start(options)] };
|
||||
|
||||
|
||||
varInd.Run(inputs, options, outputs);
|
||||
|
||||
|
||||
double[] output = outputs[0];
|
||||
int lookback = varInd.Start(options);
|
||||
|
||||
@@ -111,7 +111,7 @@ public class VarianceValidationTests
|
||||
int period = 20;
|
||||
var variance = new Variance(period, isPopulation: false);
|
||||
var popVariance = new Variance(period, isPopulation: true);
|
||||
|
||||
|
||||
var quotes = _data.SkenderQuotes.ToList();
|
||||
double[] input = quotes.Select(q => (double)q.Close).ToArray();
|
||||
|
||||
@@ -125,7 +125,7 @@ public class VarianceValidationTests
|
||||
var window = input[(i - period + 1)..(i + 1)];
|
||||
double expected = Statistics.Variance(window);
|
||||
double expectedPop = Statistics.PopulationVariance(window);
|
||||
|
||||
|
||||
Assert.Equal(expected, val.Value, ValidationHelper.DefaultTolerance);
|
||||
Assert.Equal(expectedPop, popVal.Value, ValidationHelper.DefaultTolerance);
|
||||
}
|
||||
|
||||
@@ -13,11 +13,11 @@ namespace QuanTAlib;
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Variance is calculated as the average of the squared differences from the Mean.
|
||||
///
|
||||
///
|
||||
/// Formula:
|
||||
/// Population Variance = Sum((x - Mean)^2) / N
|
||||
/// Sample Variance = Sum((x - Mean)^2) / (N - 1)
|
||||
///
|
||||
///
|
||||
/// This implementation uses the O(1) running sum of squares formula:
|
||||
/// Variance = (SumSq - (Sum * Sum) / N) / (N - 1) (for Sample)
|
||||
/// </remarks>
|
||||
@@ -76,7 +76,7 @@ public sealed class Variance : AbstractBase
|
||||
// Differential update
|
||||
double oldNewest = _buffer.Newest;
|
||||
_buffer.UpdateNewest(input.Value);
|
||||
|
||||
|
||||
// Reconstruct SumSq from previous state is safer/cleaner than differential on current
|
||||
// But we updated buffer already.
|
||||
// _sumSq currently includes oldNewest^2.
|
||||
@@ -93,12 +93,12 @@ public sealed class Variance : AbstractBase
|
||||
// Var = (SumSq - 2*Mean*(N*Mean) + N*Mean^2) / ...
|
||||
// Var = (SumSq - 2*N*Mean^2 + N*Mean^2) / ...
|
||||
// Var = (SumSq - N*Mean^2) / ...
|
||||
|
||||
|
||||
// Using Sum:
|
||||
// Var = (SumSq - (Sum*Sum)/N) / ...
|
||||
|
||||
|
||||
double numerator = _sumSq - (_buffer.Sum * _buffer.Sum) / n;
|
||||
|
||||
|
||||
// Handle floating point noise
|
||||
if (numerator < 0) numerator = 0;
|
||||
|
||||
@@ -221,14 +221,14 @@ public sealed class Variance : AbstractBase
|
||||
int len = source.Length;
|
||||
double sum = 0;
|
||||
double sumSq = 0;
|
||||
|
||||
|
||||
// We need a buffer to handle the sliding window removal
|
||||
// For scalar path, we can use a simple array or stackalloc
|
||||
const int StackAllocThreshold = 256;
|
||||
Span<double> buffer = period <= StackAllocThreshold
|
||||
? stackalloc double[period]
|
||||
: new double[period];
|
||||
|
||||
|
||||
int bufferIndex = 0;
|
||||
int i = 0;
|
||||
|
||||
@@ -265,11 +265,11 @@ public sealed class Variance : AbstractBase
|
||||
if (!double.IsFinite(val)) val = 0; // Fallback
|
||||
|
||||
double oldVal = buffer[bufferIndex];
|
||||
|
||||
|
||||
sum = sum - oldVal + val;
|
||||
sumSq = Math.FusedMultiplyAdd(-oldVal, oldVal, sumSq);
|
||||
sumSq = Math.FusedMultiplyAdd(val, val, sumSq);
|
||||
|
||||
|
||||
buffer[bufferIndex] = val;
|
||||
bufferIndex++;
|
||||
if (bufferIndex >= period) bufferIndex = 0;
|
||||
@@ -300,7 +300,7 @@ public sealed class Variance : AbstractBase
|
||||
double val = Unsafe.Add(ref srcRef, i);
|
||||
sum += val;
|
||||
sumSq = Math.FusedMultiplyAdd(val, val, sumSq);
|
||||
|
||||
|
||||
double n = i + 1;
|
||||
if (n > 1)
|
||||
{
|
||||
@@ -382,9 +382,9 @@ public sealed class Variance : AbstractBase
|
||||
var vSumSquared = Avx512F.Multiply(vSums, vSums);
|
||||
var vMeanTerm = Avx512F.Multiply(vSumSquared, vInvN);
|
||||
var vNumerator = Avx512F.Subtract(vSumSqs, vMeanTerm);
|
||||
|
||||
|
||||
vNumerator = Avx512F.Max(vZero, vNumerator);
|
||||
|
||||
|
||||
var vResult = Avx512F.Multiply(vNumerator, vInvDenom);
|
||||
Vector512.StoreUnsafe(vResult, ref Unsafe.Add(ref outRef, i));
|
||||
|
||||
@@ -414,11 +414,11 @@ public sealed class Variance : AbstractBase
|
||||
{
|
||||
double val = Unsafe.Add(ref srcRef, i);
|
||||
double oldVal = Unsafe.Add(ref srcRef, i - period);
|
||||
|
||||
|
||||
sum = sum - oldVal + val;
|
||||
sumSq = Math.FusedMultiplyAdd(-oldVal, oldVal, sumSq);
|
||||
sumSq = Math.FusedMultiplyAdd(val, val, sumSq);
|
||||
|
||||
|
||||
double numerator = sumSq - (sum * sum) * invN;
|
||||
if (numerator < 0) numerator = 0;
|
||||
Unsafe.Add(ref outRef, i) = numerator * invDenom;
|
||||
@@ -479,9 +479,9 @@ public sealed class Variance : AbstractBase
|
||||
var vSumSquared = AdvSimd.Arm64.Multiply(vSums, vSums);
|
||||
var vMeanTerm = AdvSimd.Arm64.Multiply(vSumSquared, vInvN);
|
||||
var vNumerator = AdvSimd.Arm64.Subtract(vSumSqs, vMeanTerm);
|
||||
|
||||
|
||||
vNumerator = AdvSimd.Arm64.Max(vZero, vNumerator);
|
||||
|
||||
|
||||
var vResult = AdvSimd.Arm64.Multiply(vNumerator, vInvDenom);
|
||||
Vector128.StoreUnsafe(vResult, ref Unsafe.Add(ref outRef, i));
|
||||
|
||||
@@ -511,11 +511,11 @@ public sealed class Variance : AbstractBase
|
||||
{
|
||||
double val = Unsafe.Add(ref srcRef, i);
|
||||
double oldVal = Unsafe.Add(ref srcRef, i - period);
|
||||
|
||||
|
||||
sum = sum - oldVal + val;
|
||||
sumSq = Math.FusedMultiplyAdd(-oldVal, oldVal, sumSq);
|
||||
sumSq = Math.FusedMultiplyAdd(val, val, sumSq);
|
||||
|
||||
|
||||
double numerator = sumSq - (sum * sum) * invN;
|
||||
if (numerator < 0) numerator = 0;
|
||||
Unsafe.Add(ref outRef, i) = numerator * invDenom;
|
||||
@@ -593,10 +593,10 @@ public sealed class Variance : AbstractBase
|
||||
var vSumSquared = Avx.Multiply(vSums, vSums);
|
||||
var vMeanTerm = Avx.Multiply(vSumSquared, vInvN);
|
||||
var vNumerator = Avx.Subtract(vSumSqs, vMeanTerm);
|
||||
|
||||
|
||||
// Max(0, numerator) to handle floating point noise
|
||||
vNumerator = Avx.Max(vZero, vNumerator);
|
||||
|
||||
|
||||
var vResult = Avx.Multiply(vNumerator, vInvDenom);
|
||||
Vector256.StoreUnsafe(vResult, ref Unsafe.Add(ref outRef, i));
|
||||
|
||||
@@ -628,11 +628,11 @@ public sealed class Variance : AbstractBase
|
||||
{
|
||||
double val = Unsafe.Add(ref srcRef, i);
|
||||
double oldVal = Unsafe.Add(ref srcRef, i - period);
|
||||
|
||||
|
||||
sum = sum - oldVal + val;
|
||||
sumSq = Math.FusedMultiplyAdd(-oldVal, oldVal, sumSq);
|
||||
sumSq = Math.FusedMultiplyAdd(val, val, sumSq);
|
||||
|
||||
|
||||
double numerator = sumSq - (sum * sum) * invN;
|
||||
if (numerator < 0) numerator = 0;
|
||||
Unsafe.Add(ref outRef, i) = numerator * invDenom;
|
||||
|
||||
Reference in New Issue
Block a user