Skip to content

Commit fe71472

Browse files
authored
Reject an ARIMA period too short for its own orders (#9758)
1 parent 0121537 commit fe71472

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

Indicators/AutoRegressiveIntegratedMovingAverage.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,14 @@ public AutoRegressiveIntegratedMovingAverage(
131131
"currently available fitting methods.");
132132
}
133133

134-
if (period < Math.Max(arOrder, maOrder))
134+
// ComputeNextValue indexes arrayData and _residuals up to 2 * maOrder, over a
135+
// series DifferenceSeries shortens only when diffOrder is positive.
136+
var shortest = Math.Max(arOrder, maOrder > 0 ? (2 * maOrder) + 1 : 0)
137+
+ Math.Max(diffOrder, 0);
138+
if (period < shortest)
135139
{
136-
throw new ArgumentException("Period must exceed both arOrder and maOrder");
140+
throw new ArgumentException($"Period parameter for ARIMA({arOrder}, {diffOrder}, " +
141+
$"{maOrder}) indicator must be at least {shortest} but was {period}");
137142
}
138143

139144
_arOrder = arOrder;

Tests/Indicators/AutoregressiveIntegratedMovingAverageTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,31 @@ public void AcceptsAnAutoRegressiveOrderAboveTheMovingAverageOrder(int arOrder,
6969
Assert.IsTrue(arima.IsReady);
7070
}
7171

72+
[TestCase(1, 0, 1, 3)]
73+
[TestCase(1, 1, 1, 4)]
74+
[TestCase(2, 1, 2, 6)]
75+
[TestCase(1, 2, 0, 3)]
76+
[TestCase(1, -2, 1, 3)]
77+
[TestCase(1, -3, 2, 5)]
78+
public void RejectsAPeriodTooShortForItsOrders(int arOrder, int diffOrder, int maOrder, int shortest)
79+
{
80+
var exception = Assert.Throws<ArgumentException>(() =>
81+
new AutoRegressiveIntegratedMovingAverage(arOrder, diffOrder, maOrder, shortest - 1, true));
82+
Assert.That(exception.Message, Is.EqualTo(
83+
$"Period parameter for ARIMA({arOrder}, {diffOrder}, {maOrder}) indicator " +
84+
$"must be at least {shortest} but was {shortest - 1}"));
85+
86+
var arima = new AutoRegressiveIntegratedMovingAverage(arOrder, diffOrder, maOrder, shortest, true);
87+
var reference = new DateTime(2020, 1, 1);
88+
89+
for (var i = 0; i < shortest + 1; i++)
90+
{
91+
arima.Update(reference.AddDays(i), 100m + (decimal)Math.Sin(i / 3d) * 5m);
92+
}
93+
94+
Assert.IsTrue(arima.IsReady);
95+
}
96+
7297
[Test]
7398
public void PredictionErrorAgainstExternalData()
7499
{

0 commit comments

Comments
 (0)