close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Version 3 (modified by Víctor de Buen Remiro, 12 years ago) (diff)

--

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 el generador de modelos al que hay que pasarles las periodicidades regular (1) y estacional (7), y la segunda construye una serie de 1000 datos con desviación unitaria, 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.

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

PeriodicityARMADIF
11-0.108083385881461*B-0.661191867198795*B^21+1.84687137714305*B+0.913258229847997*B^21-B
71-0.500501212900947*B^7-0.159991535823792*B^141+1.52869164096904*B^7+0.945664106402546*B^141
PeriodicityARMADIF
11+0.276724013923667*B1-0.608476788569242*B1-B
71+0.669428730927173*B^7+0.551377256400883*B^1411-B^7
PeriodicityARMADIF
11+1.71064830487263*B+0.7920374982059*B^21+0.1186861861303*B-0.577400461304933*B^21
71+0.852601298354566*B^711

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
1RealOrComplexRoots00.10.995
7RealOrComplexRoots00.10.993

y para los de diferencias :

period_.min.degree_.max.degree
102
701

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.