Code: Select all

`'Create some data. Delete these first few lines if you want to run on your existing workfile.`

create u 1000

series y=nrnd

'Program that calculates the "best" ARMA specification for an equation. Edit the variables below to match your particular data/setup.

%eqname = "EQ01" 'name of equation object that will be used.

%maxAR = "2" 'maximum number of AR terms

%maxMA = "3" 'maximum number of MA terms

%dep = "Y" 'dependent variable

%regs = "C " 'independent variables

%criterion = "@AIC" 'which criterion to use enter "@AIC" for Akaike, "@schwarz" for Schwarz, and @HQ for Hannan-Quinn

!maxAR = @val(%maxAR)

!maxMA = @val(%maxMA)

close {%eqname}

'create table for storing critical values.

%matname = "crits"

if @isobject(%matname) then

%matname = "__crits"

if @isobject(%matname) then

delete {%matname}

endif

endif

table(!maxar+2,!maxma+2) {%matname}

{%matname}(1,1) = "AR / MA"

{%matname}.setlines(1) +b

{%matname}.setlines(a) +r

'set sample

smpl @first+!maxAR @last

!mincrit = 1e12 'set the minimum to an artificially large value to begin

'estimate the models

%arstring = ""

for !i=0 to !maxar

'build up string for AR terms.

if !i>0 then

%arstring = %arstring + " ar(" + @str(!i) + ")"

endif

%mastring = ""

for !j=0 to !maxma

'build up string for MA terms

if !j>0 then

%mastring = %mastring + " ma(" + @str(!j) + ")"

endif

'estimate equation

equation {%eqname}.ls {%dep} {%regs} {%arstring} {%mastring}

'capture criterion

if @upper(%criterion) = "@AIC" then

!crit = {%eqname}.@aic

endif

if @upper(%criterion) = "@SCHWARZ" then

!crit = {%eqname}.@schwarz

endif

if @upper(%criterion) = "@HQ" then

!crit = {%eqname}.@hq

endif

'compare criterion

if !crit < !mincrit then

!mincrit = !crit

!bestAR = !i

!bestMA = !j

%bestARstr = %arstring 'store the best ar string

%bestMAstr = %mastring 'store the best ma string

{%matname}.settextcolor(@all) black 'table formatting.

!ii=!i+2

!jj=!j+2

{%matname}.settextcolor(!ii,!jj) red

endif

{%matname}(!i+2,!j+2) = !crit

{%matname}(!i+2,1) = !i

{%matname}(1,!j+2) = !j

next

next

equation {%eqname}.ls {%dep} {%regs} {%bestARstr} {%bestMAstr}

show {%eqname}

show {%matname}