Generación de modelos ARIMA simulados por ingeniería inversa
La generación de modelos ARIMA simulados por ingeniería inversa tiene una gran utilidad en el desarrollo de aplicaciones relativas a modelos ARIMA pues permite contrastar de forma masiva los resultados teóricos con los reales.
Para ser más exactos se trata de modelos ARIMA multi-estacionales que se generan automáticamente a partir de unos pocos parámetros dados por el usuario, como las periodicidades estacionales, los grados máximos de diferencias, partes AR y MA, longitud, fechado y fecha final de la serie, desviación típica teórica, etc.
Pongamos que queremos generar una serie ARIMA diaria con estacionalidad semanal.
NameBlock rndArima = ArimaTools::@RandArima::Create([[1,7]]); NameBlock rndArimaSer = { ArimaTools::@RandArimaSeries::Draw( NameBlock rndArima, Real sigma = 1, Real N=1000, TimeSet Diario, Date lastDate=Today, Real maxNoiseSigmaRatio=5 )};
La primera sentecia construye una instancia de la clase ArimaTools::@RandArima
que es
un generador de modelos al que hay que pasarles las periodicidades
regular (1) y estacional (7).
La segunda construye una instancia de la clase ArimaTools::@RandArima
que contiene la
serie de 1000 datos de ruido ARIMA con residuos de desviación típica igual a 1,
fechado diario, fecha final el día de hoy y máximo ratio de desviación igual 5. Esto último significa
que el cociente entre la desviación de la serie con una diferencia regular como máximo no puede ser
mayor que 5 veces la desviación teórica. El objetivo es no generar modelos con patologías graves.
Tambiém incluye la serie de ruido diferenciado, y la de residuos y sus versiones matriciales, así
como el modelo ARIMA tabular, los polinomios y los grados conjuntos y la etiqueta estandarizada:
Si no nos interesasen las series y sólo quisiéramos obtener la estrutura ARIMA llamaríamos al método
Set rndArima::draw(?);
que es el mismo al que llama internamente ArimaTools::@RandArimaSeries::Draw
y que nos
devolverá una tabla de filas con estructura
Struct @ARIMAStruct { Real Periodicity; Polyn AR; Polyn MA; Polyn DIF; }
y grados y coeficientes aleatorios como estos tres ejemplos
Periodicity | AR | MA | DIF
|
1 | 1-0.108083385881461*B-0.661191867198795*B^2 | 1+1.84687137714305*B+0.913258229847997*B^2 | 1-B
|
7 | 1-0.500501212900947*B^7-0.159991535823792*B^14 | 1+1.52869164096904*B^7+0.945664106402546*B^14 | 1
|
Periodicity | AR | MA | DIF
|
1 | 1+0.276724013923667*B | 1-0.608476788569242*B | 1-B
|
7 | 1+0.669428730927173*B^7+0.551377256400883*B^14 | 1 | 1-B^7
|
Periodicity | AR | MA | DIF
|
1 | 1+1.71064830487263*B+0.7920374982059*B^2 | 1+0.1186861861303*B-0.577400461304933*B^2 | 1
|
7 | 1+0.852601298354566*B^7 | 1 | 1
|
Se puede establecer un grado mínimo y máximo para cada polinomio, AR, MA y DIF de cada estacionalidad. Para los polinomios AR y MA se puede configurar también el mínimo y el máximo de los módulos de los inversos de las raíces y si se desean raíces reales, reales positivas o si se admiten raíces complejas.
Los valores configurables tienen valores por defecto que normalmente sirven a efectos generales.
Para los polinomios AR y MA los valores por defecto son:
period | _.rootsType | _.min.degree | _.min.invRootModule | _.max.invRootModule | _.max.degree
|
1 | RealOrComplexRoots | 0 | 0.1 | 0.99 | 5
|
7 | RealOrComplexRoots | 0 | 0.1 | 0.99 | 3
|
y para los de diferencias :
period | _.min.degree | _.max.degree
|
1 | 0 | 2
|
7 | 0 | 1
|
Si por ejemplo queremos forzar que las raíces AR regulares sean reales positivas y que el grado máximo MA estacinal sea 2 haríamos lo siguiente:
NameBlock rndArima = ArimaTools::@RandArima::Create([[1,7]]); Text (rndArima::factor[1])::ar::rootsType := ArimaTools::@RandStationary::RootsType::RealPositiveRoots; Real (rndArima::factor[2])::ma::max.degree := 2; Set rndArima::rebuild(?); NameBlock rndArimaSer = ArimaTools::@RandArimaSeries::Draw(rndArima,1,1000,Diario,Today,5);
La llamada al método rebuild
asegura que toda la información del generador es consistente.