B
    Z              	   @   s
  d Z ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
mZ ddlmZ ddlZddlmZmZ ddlmZ dd	d
ZdddZG dd deZG dd deZG dd deZG dd deZG dd deZdd ZG dd deZG dd deZdd d!Z dd#d$Z!dd%d&Z"d'd( Z#dd)l$m%Z% dd*d+Z&d,d- Z'd.d/ Z(dd1d2Z)e*d3k
rd4gZ+d5e+krvej,- Z.e/d6 dd7gZ0dd8gZ1e.2e0e1d9d"Z3e3e34 8 Z3ee3Z5de5_6de5_7e5j8d:d;Z9e/e9j: ee3Z;e;j8d<d;Z<e/e<j: e/e<j=>e<j: e/ej?e5j@d=d>e<j: e.8e3ddZAe/eAd  e/eAd  e/d? e/d@ e/d7d8d"g e/dA e/e9j: e/dB e/e<j: e/dC e.jBZCe/eAd eDeEeCeCeCjFd   e5Ge<j:ZHe/dD e/eEeCeCeCjFd  eAd   e/dE e/e<j=jIdF ddGddGf  e/dH e/ejJKej?e5j@d=d>e<j:ddGddGf   ee3dG ZLeLj8d<d;ZMe/eMj: d9ZNd4e+kre eNddIgdd"gd8dJ\ZHZOddlmZ eP  eQdK eReH eQdL eReO dMZSejTUdNZSe/dOeS ejTSeS dPZVe!eNdeVgdd8gdQd"dR\ZHZOe)eHeO e)eHdSd eOdSd  ejTSeS e"eNdeVgddgd8dggdQd"dR\ZWZXZYe)eWdeN eXdeN dT e)eWdSeN eXdSeN dT ejTSeS e"eNdeVgddgd"dUggdQd"dR\ZZZ[ZYe)eZdeN e[deN dV e)eZdSeN e[dSeN dV ejTSeS e"eNdeVgddgd"dUgd"dUgd"dUggdQd"dR\Z\Z]Z^e)e\deN e]deN dW e)e\dSeN e]dSeN dW ejTSeS e"eNdeVgdddgdd"dUgdd"dUgdd"dUggdQd"dR\Z_Z`Zae)e_deN e`deN dW e)e_dSeN e`dSeN dW ebdXZcdecd< e"dXddYgdddgdd"dZgdd[d\gdd=d]ggdQd"ecd^\ZdZeZfe)eddd_ eedd_ dW ejTUdNZSe/dOeS egd_hd`dGZiejekeijFd dfeifZle%ddgemdadbdgdQdQdggel\ZnZod9ZNd9ZpejTSeS ddcgZ0dddgddddQggZ1e"epeN e0e1dddedR\Z_Z`Zae_epd e`epd eaepd   Z_Z`Zae)e_deN e`deN dW ee_e_4  Zqdeq_6deq_7emdfd"dgdQgeq_reqj8emdfd"dgdQgd9dhZse/diesj: e)eqjteqjO e/dj e/e
udkdl dmdUdgg ee_e_4  Zvdev_6deq_7emdfdgd"gZwewev_revj8ewdndhZxe/doexj: ee_e_4  Zvdev_6deq_7emdfdgd"gZwewev_revj8ewd<dndpZxe/doexj: dqe+k	rPddrlymzZz ez{dsZ|ezj}dtduZie/dve~eeidGddw  eeeidGZLeLj8dxd"d8gdydhZe/ej: eeeidGZej8dxd"d8gdyd<dzZe/ej: e#dmdUdgge_Ze/ed  e"d_e0e1d{d=ekd_d^\ZZZejTd_ZndmdUdggZ:e#e:en\ZZZeZdZeeZNd|eeeeeendG e e eNedGej    Ze/ee ejTSd ebd}Zx:edd}D ],ZejT ZdUeed   d=e  ee< 
q,W edXd ZeeZej8d~dd e/d e/ej: dS )aQ	  general non-linear MLE for time series analysis

idea for general version
------------------------

subclass defines geterrors(parameters) besides loglike,...
and covariance matrix of parameter estimates (e.g. from hessian
or outerproduct of jacobian)
update: I don't really need geterrors directly, but get_h the conditional
    variance process

new version Garch0 looks ok, time to clean up and test
no constraints yet
in some cases: "Warning: Maximum number of function evaluations has been exceeded."

Notes
-----

idea: cache intermediate design matrix for geterrors so it doesn't need
    to be build at each function call

superclass or result class calculates result statistic based
on errors, loglike, jacobian and cov/hessian
  -> aic, bic, ...
  -> test statistics, tvalue, fvalue, ...
  -> new to add: distribution (mean, cov) of non-linear transformation
  -> parameter restrictions or transformation with corrected covparams (?)
  -> sse, rss, rsquared  ??? are they defined from this in general
  -> robust parameter cov ???
  -> additional residual based tests, NW, ... likelihood ratio, lagrange
     multiplier tests ???

how much can be reused from linear model result classes where
   `errorsest = y - X*beta` ?

for tsa: what's the division of labor between model, result instance
    and process

examples:
 * arma: ls and mle look good
 * arimax: add exog, especially mean, trend, prefilter, e.g. (1-L)
 * arma_t: arma with t distributed errors (just a change in loglike)
 * garch: need loglike and (recursive) errorest
 * regime switching model without unobserved state, e.g. threshold


roadmap for garch:
 * simple case
 * starting values: garch11 explicit formulas
 * arma-garch, assumed separable, blockdiagonal Hessian
 * empirical example: DJI, S&P500, MSFT, ???
 * other standard garch: egarch, pgarch,
 * non-normal distributions
 * other methods: forecast, news impact curves (impulse response)
 * analytical gradient, Hessian for basic garch
 * cleaner simulation of garch
 * result statistics, AIC, ...
 * parameter constraints
 * try penalization for higher lags
 * other garch: regime-switching

for pgarch (power garch) need transformation of etax given
   the parameters, but then misofilter should work
   general class aparch (see garch glossary)

References
----------

see notes_references.txt


Created on Feb 6, 2010
@author: "josef pktd"
    )print_function)zipN)assert_almost_equal)optimizesignal)ModelLikelihoodModelResults)tsac             C   s   t j| d |dS )z<Helper function to calculate sum of squares along first axis   )axis)npsum)xr    r   <lib/python3.7/site-packages/statsmodels/sandbox/tsa/garch.pysumofsqZ   s    r      Fc             C   s   t | } t | } |d kr$|  } | jdkr:| j| }nt| }| | } |rdt dt j t | | d |   }t 	||}||fS dt 	t ||t 	| d | | |t dt j    }|S d S )Nr   g      r
   )
r   asarray
atleast_1dZravelndimshapelenlogpir   )r   musigma2Z	returnllsr   nobsllsZLLr   r   r   normloglike_   s    


*>r   c                   sT   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dddZ
  ZS )LikelihoodModelz2
    Likelihood model is a subclass of Model.
    Nc                s   t t| || |   d S )N)superr   __init__
initialize)selfendogexog)	__class__r   r   r!   ~   s    zLikelihoodModel.__init__c             C   s   dS )z
        Initialize (possibly re-initialize) a Model instance. For
        instance, the design matrix of a linear model may change
        and some things must be recomputed.
        Nr   )r#   r   r   r   r"      s    zLikelihoodModel.initializec             C   s   t dS )z*
        Log-likelihood of model.
        N)NotImplementedError)r#   paramsr   r   r   loglike   s    zLikelihoodModel.loglikec             C   s   t dS )zf
        Score vector of model.

        The gradient of logL with respect to each parameter.
        N)r'   )r#   r(   r   r   r   score   s    zLikelihoodModel.scorec             C   s   t dS )zn
        Fisher information matrix of model

        Returns -Hessian of loglike evaluated at params.
        N)r'   )r#   r(   r   r   r   information   s    zLikelihoodModel.informationc             C   s   t dS )z1
        The Hessian matrix of the model
        N)r'   )r#   r(   r   r   r   hessian   s    zLikelihoodModel.hessiannewton#   :0yE>c          
      s  ddddddg}|dkr*dg j jd	  }||kr>td
|  fdd} fdd}d}| dkrd}	t|}
tj|
g}xr|	|k rtt|d |d  |kr 	|d }|d t
tj| |d  }|| |	d	7 }	qW t |}|	|_n|dkrrd}tj|||d	||d\}}}}}}}| }t |}d}tt|d|||||||g _nx|dkrtj||||d	||d\}}}}}}t |}| }n8|dkrtj||d	||d\}}}}}t |}| }| _|S )aK  
        Fit method for likelihood based models

        Parameters
        ----------
        start_params : array-like, optional
            An optional

        method : str
            Method can be 'newton', 'bfgs', 'powell', 'cg', or 'ncg'.
            The default is newton.  See scipy.optimze for more information.
        r-   bfgspowellZcgncgfminNr   r   zUnknown fit method %sc                s     |  S )N)r)   )r(   )r#   r   r   <lambda>   s    z%LikelihoodModel.fit.<locals>.<lambda>c                s     |  S )N)r*   )r(   )r#   r   r   r4      s    )full_outputmaxiterZgtolz8xopt, fopt, gopt, Hopt, func_calls, grad_calls, warnflagz, )Zfhessr7   r8   Zavextol)r7   r8   Zxtol)r%   r   
ValueErrorlowerr   arrayinfallabsr,   dotlinalginvr*   appendr   	iterationr   Z	fmin_bfgsdictr   splitoptimresultsZfmin_ncgr3   Z_results)r#   start_paramsmethodr8   tolmethodsfr*   ZhessrC   starthistoryHZ	newparamsmlefitZxoptZfoptZgoptHoptZ
func_callsZ
grad_callsZwarnflagZconvergeZoptresZfcallsZgcallsZhcallsZniterZfuncallsr   )r#   r   fit   sT    









zLikelihoodModel.fit)N)Nr-   r.   r/   )__name__
__module____qualname____doc__r!   r"   r)   r*   r+   r,   rQ   __classcell__r   r   )r&   r   r   y   s   
r   c                   sP   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zd fdd	Z	  Z
S )
TSMLEModelzp
    univariate time series model for estimation with maximum likelihood

    Note: This is not working yet
    Nc                s"   t t| || d| _d| _d S )Nr   )r    rW   r!   narnma)r#   r$   r%   )r&   r   r   r!      s    zTSMLEModel.__init__c             C   s   t d S )N)r'   )r#   r(   r   r   r   	geterrors   s    zTSMLEModel.geterrorsc             C   s   t dS )z}
        Loglikelihood for timeseries model

        Notes
        -----
        needs to be overwritten by subclass
        N)r'   )r#   r(   r   r   r   r)      s    zTSMLEModel.loglikec             C   s   t j| jdd}||d S )z-
        Score vector for Arma model
        g-C6?)stepMaxr5   )ndtJacobianr)   )r#   r(   jacr   r   r   r*     s    zTSMLEModel.scorec             C   s   t j| jdd}||d S )zE
        Hessian of arma model.  Currently uses numdifftools
        g-C6?)r[   r5   )r\   r]   r*   )r#   r(   Hfunr   r   r   r,     s    zTSMLEModel.hessian  r3   :0yE>c                s4   |dkrt | dr| j}tt| j||||d}|S )zhestimate model by minimizing negative loglikelihood

        does this need to be overwritten ?
        N_start_params)rG   r8   rH   rI   )hasattrrb   r    rW   rQ   )r#   rG   r8   rH   rI   rO   )r&   r   r   rQ     s
    zTSMLEModel.fit)N)Nr`   r3   ra   )rR   rS   rT   rU   r!   rZ   r)   r*   r,   rQ   rV   r   r   )r&   r   rW      s   		rW   c                   s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )Garch0a@  Garch model,

    still experimentation stage:
    simplified structure, plain garch, no constraints
    still looking for the design of the base class

    serious bug:
    ar estimate looks ok, ma estimate awful
    -> check parameterization of lagpolys and constant
    looks ok after adding missing constant
        but still difference to garch11 function
    corrected initial condition
    -> only small differences left between the 3 versions
    ar estimate is close to true/DGP model
    note constant has different parameterization
    but design looks better

    Nc                s>   t t| || d| _d| _|d | _t| j | _	d S )Nr   r
   )
r    rd   r!   rX   rY   _etaxr   r   mean_icetax)r#   r$   r%   )r&   r   r   r!   9  s
    
zGarch0.__init__c             C   s   d S )Nr   )r#   r   r   r   r"   D  s    zGarch0.initializec       
      C   sL   |\}}}| j | }| j}|jd }t|||}tj||||dd }	|	S )z

        Parameters
        ----------
        params : tuple, (ar, ma)
            try to keep the params conversion in loglike

        copied from generate_gjrgarch
        needs to be extracted to separate function
        r   )zi)re   rg   r   r   lfilticlfilter)
r#   r(   armar   etaxicetaxr   rh   hr   r   r   gethG  s    


zGarch0.gethc             C   s   | j | j }}tdg|d| f}tdg||||  f}|d }|||f}| |}|| _|| _t|d}d}	t|}
d}	dt	t
||	t	| jd | |	 |
t
dtj    }|S )aY  
        Loglikelihood for timeseries model

        Notes
        -----
        needs to be overwritten by subclass

        make more generic with using function _convertparams
        which could also include parameter transformation
        _convertparams_in, _convertparams_out

        allow for different distributions t, ged,...
        r   Nr   r5   gư>g      r
   )rX   rY   r   concatenaterp   params_convertedro   maximumr   r   r   r$   r   )r#   r(   pqrk   rl   r   ro   r   r   r   lliker   r   r   r)   f  s    

>zGarch0.loglike)N)	rR   rS   rT   rU   r!   r"   rp   r)   rV   r   r   )r&   r   rd   &  s
   rd   c                   sB   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Z  Z	S )GarchXa  Garch model,

    still experimentation stage:
    another version, this time with exog and miso_filter
    still looking for the design of the base class

    not done yet, just a design idea
    * use misofilter as in garch (gjr)
    * but take etax = exog
      this can include constant, asymetric effect (gjr) and
      other explanatory variables (e.g. high-low spread)

    todo: renames
    eta -> varprocess
    etax -> varprocessx
    icetax -> varprocessic (is actually ic of eta/sigma^2)
    Nc                sR   t t| || d| _d| _tttdf|d || _	t
| j	 | _d S )Nr   r
   )r    rd   r!   rX   rY   r   column_stackonesr   re   r   rf   rg   )r#   r$   r%   )r&   r   r   r!     s
    zGarchX.__init__c             C   s   d S )Nr   )r#   r   r   r   r"     s    zGarchX.initializec             C   s   d S )Nr   )rk   rl   r   r   r   r   convert_mod2params  s    zGarchX.convert_mod2paramsc       
      C   sT   |\}}}| j | }| j}| j}t|||| jdd }|dk }	|	 rPt|}|S )z

        Parameters
        ----------
        params : tuple, (ar, ma)
            try to keep the params conversion in loglike

        copied from generate_gjrgarch
        needs to be extracted to separate function
        )useicr   )re   rg   r   miso_lfilteranyr   r>   )
r#   r(   rk   rl   r   rm   rn   r   ro   hnegr   r   r   rp     s    


zGarchX.gethc             C   s   | j | j }}tdg|d| f}tdg||||  f}|d }|||f}| |}|| _|| _t|d}d}	t|}
d}	dt	t
||	t	| jd | |	 |
t
dtj    }|S )aY  
        Loglikelihood for timeseries model

        Notes
        -----
        needs to be overwritten by subclass

        make more generic with using function _convertparams
        which could also include parameter transformation
        _convertparams_in, _convertparams_out

        allow for different distributions t, ged,...
        r   Nr   r5   gư>g      r
   )rX   rY   r   rq   rp   rr   ro   rs   r   r   r   r$   r   )r#   r(   rt   ru   rk   rl   r   ro   r   r   r   rv   r   r   r   r)     s    

>zGarchX.loglike)N)
rR   rS   rT   rU   r!   r"   rz   rp   r)   rV   r   r   )r&   r   rw     s   (rw   c                   s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )GarchzOGarch model gjrgarch (t-garch)

    still experimentation stage, try with

    Nc                s"   t t| || d| _d| _d S )Nr   )r    r   r!   rX   rY   )r#   r$   r%   )r&   r   r   r!     s    zGarch.__init__c             C   s   d S )Nr   )r#   r   r   r   r"   "  s    zGarch.initializec       
   	   C   s   |\}}| j }|jd }t|df}d|dddf< |d dddf |ddddf< d||dkdf< t|||t|dddf  dd }|dk }| rt|}t	|| }	|	||fS )z

        Parameters
        ----------
        params : tuple, (mu, ar, ma)
            try to keep the params conversion in loglike

        copied from generate_gjrgarch
        needs to be extracted to separate function
        r      r   Nr
   )r{   )
r$   r   r   emptyr|   r   rf   r}   r>   sqrt)
r#   r(   rk   rl   etar   rm   ro   r~   errr   r   r   rZ   %  s    
$*
zGarch.geterrorsc             C   s@  | j | j }}tdg|d| f}t|d df}|d |d< tdg||||  f|dddf< tdg||| |d|   f|dddf< |d }||f}| |\}}}	|| _|||	  | _| _| _	t
|d}
d}t|}d}| }d	tt|
|t| jd |
 | |tdtj    }|S )
z}
        Loglikelihood for timeseries model

        Notes
        -----
        needs to be overwritten by subclass
        r   Nr   r5   )r   r   r   r
   gư>g      )rX   rY   r   rq   zerosrZ   rr   	errorsestro   rm   rs   r   rf   r   r   r$   r   )r#   r(   rt   ru   rk   rl   r   r   ro   rm   r   r   r   Zmuyrv   r   r   r   r)   I  s&    (0	>zGarch.loglike)N)	rR   rS   rT   rU   r!   r"   rZ   r)   rV   r   r   )r&   r   r     s
   $r   c       
      C   s   || }}t dg|d| f}t |d df}|d |d< t dg||||  f|dddf< t dg||| |d|   f|dddf< |d }||f}	tS )zU
    flat to matrix

    Notes
    -----
    needs to be overwritten by subclass
    r   Nr   r5   )r   r   r   r
   )r   rq   r   Zparamsclass)
r#   r(   rX   rY   rt   ru   rk   rl   r   Zparams2r   r   r   gjrconvertparams~  s    
(0r   c                   sX   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	d fdd	Z
  ZS )ARz
    Notes
    -----
    This is not general, only written for the AR(1) case.

    Fit methods that use super and broyden do not yet work.
    Nr   c                sF   |d kr|d |  }||d  }t t| || |  j|7  _d S )N)r    r   r!   r   )r#   r$   r%   Znlags)r&   r   r   r!     s
    zAR.__init__c             C   s   d S )Nr   )r#   r   r   r   r"     s    zAR.initializec             C   s   | j }| j}| j}| j}t|tr,t|}d}tt	|dk s\|r\|}t
dg}d}t|t|| }d| ||d d d|d     }	| d tdtj  |d t|	  dtd|d    d| |	  |d d d|d   d|	   }
|r|
d|d d  8 }
|
S )	z
        The unconditional loglikelihood of an AR(p) process

        Notes
        -----
        Contains constant term.
        Fr   gH.?Tr   r
   g      ?i  )r   r$   r%   penalty
isinstancetupler   r   r=   r>   r;   r   r?   r   r   )r#   r(   r   yylagr   Z
usepenaltyZ	oldparams	diffsumsqr   r)   r   r   r   r)     s$    

$L"z
AR.loglikec       
   
   C   sJ  | j }| j}| j}t|t|| }d| d t||t|| dddf   d| |d d   }d| ||d d d|d     }| d|  | |d|d    d| t||t|| dddf    d|d  | |  |d d | |  |d d d|d   d|d   |  }| jr8t| j	}	|	|S )z
        Notes
        -----
        Need to generalize for AR(p) and for a constant.
        Not correct yet.  Returns numerical gradient.  Depends on package
        numdifftools.
        r   r6   Nr
   r   g      ?)
r$   r%   r   r   r   r?   r   r   r]   r)   )
r#   r(   r   r   r   r   Zdsdrr   Zgradientjr   r   r   r*     s    0$v*
zAR.scorec             C   s   dS )z%
        Not Implemented Yet
        Nr   )r#   r(   r   r   r   r+     s    zAR.informationc             C   s   t | j}||S )zN
        Returns numerical hessian for now.  Depends on numdifftools.
        )Hessianr)   )r#   r(   ro   r   r   r   r,     s    
z
AR.hessianr0   r.   :0yE>Fc       	         s   | _ | } fdd}|dkr<tt j||||d ndg}|dkrVtdg}|dkrtj||d	|d
}|dd \ _	 _
|dkrtj||d	|d
}|d  _	|dkrt||}|d  _	dS )a  
        Fit the unconditional maximum likelihood of an AR(p) process.

        Parameters
        ----------
        start_params : array-like, optional
            A first guess on the parameters.  Defaults is a vector of zeros.
        method : str, optional
            Unconstrained solvers:
                Default is 'bfgs', 'newton' (newton-raphson), 'ncg'
                (Note that previous 3 are not recommended at the moment.)
                and 'powell'
            Constrained solvers:
                'bfgs-b', 'tnc'
            See notes.
        maxiter : int, optional
            The maximum number of function evaluations. Default is 35.
        tol = float
            The convergence tolerance.  Default is 1e-08.
        penalty : bool
            Whether or not to use a penalty function.  Default is False,
            though this is ignored at the moment and the penalty is always
            used if appropriate.  See notes.

        Notes
        -----
        The unconstrained solvers use a quadratic penalty (regardless if
        penalty kwd is True or False) in order to ensure that the solution
        stays within (-1,1).  The constrained solvers default to using a bound
        of (-.999,.999).
        c                s     |  S )N)r)   )r(   )r#   r   r   r4      s    zAR.fit.<locals>.<lambda>)r-   r0   r2   )rG   rH   r8   rI   )g+g+?Nr   zbfgs-bT)Zapprox_gradboundsr
   Ztncr1   )r   r:   r    r   rQ   r   r;   r   Zfmin_l_bfgs_br(   llfZfmin_tncZfmin_powell)	r#   rG   rH   r8   rI   r   Zminfuncr   Zretval)r&   )r#   r   rQ     s(    !


zAR.fit)Nr   )Nr0   r.   r   F)rR   rS   rT   rU   r!   r"   r)   r*   r+   r,   rQ   rV   r   r   )r&   r   r     s   	 r   c                   sX   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	d fdd	Z
  ZS )Armaz
    univariate Autoregressive Moving Average model

    Note: This is not working yet, or does it
    this can subclass TSMLEModel
    Nc                s"   t t| || d| _d| _d S )Nr   )r    r   r!   rX   rY   )r#   r$   r%   )r&   r   r   r!   C  s    zArma.__init__c             C   s   d S )Nr   )r#   r   r   r   r"   K  s    zArma.initializec             C   sV   | j | j }}tdg|d | f}tdg||||  f}t||| j}|S )Nr   )rX   rY   r   rq   r   rj   r$   )r#   r(   rt   ru   ZrhoyZrhoer   r   r   r   rZ   N  s
    zArma.geterrorsc             C   sh   |  |}t|d d d}d}t|}d|t| t|d | | |tdtj    }|S )z
        Loglikelihood for arma model

        Notes
        -----
        The ancillary parameter is assumed to be the last element of
        the params vector
        r5   r
   gư>r   g      )rZ   r   rs   r   r   r   r   )r#   r(   r   r   r   r   rv   r   r   r   r)   V  s    
8zArma.loglikec             C   s   t j| jdd}||d S )z-
        Score vector for Arma model
        g-C6?)r[   r5   )r\   r]   r)   )r#   r(   r^   r   r   r   r*   s  s    z
Arma.scorec             C   s   t j| jdd}||d S )zE
        Hessian of arma model.  Currently uses numdifftools
        g-C6?)r[   r5   )r\   r]   r*   )r#   r(   r_   r   r   r   r,   ~  s    zArma.hessian  r3   :0yE>c                sF   |d kr*t dt | j| j  dgf}tt| j||||d}|S )Ng?r   )rG   r8   rH   rI   )r   rq   ry   rX   rY   r    r   rQ   )r#   rG   r8   rH   rI   rO   )r&   r   r   rQ     s
    "zArma.fit)N)Nr   r3   r   )rR   rS   rT   rU   r!   r"   rZ   r)   r*   r,   rQ   rV   r   r   )r&   r   r   ;  s   	r         ?c             C   sN   ddl m} |||| d}|| d }t|}t|tj|  }||fS )zrsimulate garch like process but not squared errors in arma
    used for initial trial but produces nice graph
    r   )arma_generate_sampleg?r
   )Zstatsmodels.tsa.arima_processr   r   Zexpr   randomrandn)r   rk   rl   r   r   ro   r   r   r   r   generate_kindofgarch  s    
r   皙?c             C   s8   |t j|  }t|||d }t || }||fS )zvsimulate standard garch

    scale : float
       scale/standard deviation of innovation process in GARCH process
    r
   )r   r   r   r   rj   r   )r   rk   rl   r   scaler   ro   r   r   r   r   generate_garch  s    r   c       
      C   s   |dkr|t j|  }n|}t | df}||dddf< |d dddf |ddddf< d||dkdf< t|||d }t |dt| | }	|	||fS )a  simulate gjr garch process

    Parameters
    ----------
    ar : array_like, 1d
        autoregressive term for variance
    ma : array_like, 2d
        moving average term for variance, with coefficients for negative
        shocks in second column
    mu : float
        constant in variance law of motion
    scale : float
       scale/standard deviation of innovation process in GARCH process

    Returns
    -------
    err : array 1d, (nobs+?,)
        simulated gjr-garch process,
    h : array 1d, (nobs+?,)
        simulated variance
    etax : array 1d, (nobs+?,)
        data matrix for constant and ma terms in variance equation

    Notes
    -----

    References
    ----------



    Nr   r   r
   r   )r   r   r   r   r|   r   r   )
r   rk   rl   r   r   varinnovationr   rm   ro   r   r   r   r   generate_gjrgarch  s    "$r   c             C   s   | d }| d }| d }|d }|j d }t|}| |d< x:td|D ],}||||d    |||d    ||< qLW t|}	||	 }
dtdtj  t|	 d|
d   }| ||fS )Nr   r   r
   g      g      ?)	r   r   r   rf   ranger   r   r   r   )r(   r   wZalphaZbetaZy2r   htiZsqrthtr   Zllvaluesr   r   r   loglike_GARCH11  s    

,
*r   )r|   c          
   C   s  t |}t | } t||dddddf dd|jd d d f }t||dddddf dd|jd d d f }t|| |jd }|rtjdg| |tt 	ddg| |dd d| |d| fS tdg| |d| |d| fS dS )	a  
    use nd convolution to merge inputs,
    then use lfilter to produce output

    arguments for column variables
    return currently 1d

    Parameters
    ----------
    ar : array_like, 1d, float
        autoregressive lag polynomial including lag zero, ar(L)y_t
    ma : array_like, same ndim as x, currently 2d
        moving average lag polynomial ma(L)x_t
    x : array_like, 2d
        input data series, time in rows, variables in columns

    Returns
    -------
    y : array, 1d
        filtered output series
    inp : array, 1d
        combined input series

    Notes
    -----
    currently for 2d inputs only, no choice of axis
    Use of signal.lfilter requires that ar lag polynomial contains
    floating point numbers
    does not cut off invalid starting and final values

    miso_lfilter find array y such that::

            ar(L)y_t = ma(L)x_t

    with shapes y (nobs,), x (nobs,nvars), ar (narlags,), ma (narlags,nvars)

    Nr5   r   r
   r   g      ?g        )rh   )
r   r   r   convolver   Z	correlater   rj   ri   r;   )rk   rl   r   r{   inp2inpr   r   r   r   miso_lfilter_old	  s    &

88

4r   c              C   s  t ddd} tddgddgddgg| \}}t|d d | d dd	 tt dt 	ddd d }t|d d |dd	 tt dt 	d
dd d }tddgddgddgg| \}}t|| dd	 t||dd	 tddgddgddgg| \}}t||dd	 t||dd	 t 
t 	| jd df| f}tddgt dddgdddgg|\}}|t dddg d}t|d d |dd	 t||dd	 | }|dd   |d ddf 7  < tddgt dddgdddgg|\}}t|d d |dd	 t||dd	 | }|dd   |d ddf 7  < tddgt dddgdddgg|\}}t|d d |dd	 t||dd	 tddgt dddgdddgg|\}}t|d d | dd	 | }|dd   |d ddf 7  < tddgt dddgdddgg|\}}t|d d |dd	 t||dd	 tddgt dddgdddgg|\}}t|d d | dd	 tddgddgddgddgg| \}}t | d d df dddg}t||dd	 t||dd	 tddgddgddgddgg| \}}t | d d df dddg}t||dd	 t||dd	 tddgddgddgddgg| \}}t | d d df dddg}|dd   | d d df 7  < t||dd	 t||dd	 d S )N   
   r
   g      ?r5   r   r      )decimal   g       r   g        r6   )r   arangereshaper|   r   r   cumsumr   r   ry   rx   r   r;   copy)r   r   r   r   x3Zy3Zy4Zytr   r   r   test_misofilterH  sb      ""  * * ** **&&& r   c           	   C   s  t d} d| d< tdddgdddgdddgdddgdd	d
ggdd| d\}}}t dddd	ddg}t|d d |dd tdddgdddgdddgdddgdd	d
ggdd| d\}}}t|d d | dd tdddgdddgdddgdddgdd	d
ggdd| d\}}}dg}x |D ]}|||d   qW t|d d |dd  dd t d} d| d< tdddgdddgdddgdddgdd	d
ggdd| d\}}}t ddddddg}t|d d |dd tdddgdddgdddgdddgdd	d
ggdd| d\}}}t|d d | dd tdddgdddgdddgdddgdd	d
ggdd| d\}}}dg}x |D ]}|||d   qvW t|d d |dd  dd d S )Nd   g      ?r   r   g?g?g?gffffff?g{Gz?g333333?g        )r   r   r      r   )r   g      r5   g?g      ?gQ?)r   r   r   r;   r   r   rB   )varinnoerrgjr5hgjr5etax5r   Zht1ro   r   r   r   test_gjrgarch  sH    

"
"
"
 

"
"
"
 r   Garch simulationc             C   st   t   t d t |  t | t d t d t | d  t d t d t | t d d S )Ni7  r   i8  r
   z$y^2$i9  zconditional variance)pltfiguresubplotplottitleZylabel)r   ro   r   r   r   r   	garchplot  s    







r   __main__ZgarchZarmaz

Example 1gg      ?i  r3   )rH   r0   g{Gz?)r[   z
parameter estimatez*parameter of DGP ar(1), ma(1), sigma_errorzmle with fminzmle with bfgsz(cond. least squares uses optim.leastsq ?z cond least squares parameter covzbfgs hessianrP   r
   znumdifftools inverse hessiangffffff)r         i֢: i seedgg        )r   r   ipz%GJR-GARCH(1,1) Simulation - symmetricg?zGJR-GARCH(1,1) SimulationzGJR-GARCH(1,3) Simulationr   g       g?g?gffffff?g333333?)r   r   r   r   r   g       r   gffffffg?g)\(?g333333g?)rG   r8   zggres.paramsZGarch11c             C   s   t | tt  d  S )Nr   )r   errgjr4rf   )r(   r   r   r   r4   ]  s    r4   g(\?i  zggres0.params)rG   rH   r8   rpy)rz~garch(1, 1)i  )nzR acfr   gɿi  )rG   r8   rH   g{Gz?g         r1   T)rH   r   z5Unconditional MLE for AR(1) y_t = .9*y_t-1 +.01 * err)r   )r   r   Fr   )r   )r   r   )r   r   N)F)r   )rU   Z
__future__r   Zstatsmodels.compat.pythonr   Znumpyr   Znumpy.testingr   Zscipyr   r   Zmatplotlib.pyplotZpyplotr   Znumdifftoolsr\   Zstatsmodels.base.modelr   r   Zstatsmodels.sandboxr	   r   r   r   rW   rd   rw   r   r   r   r   r   r   r   r   Z#statsmodels.tsa.filters.filtertoolsr|   r   r   r   r   rR   ZexamplesZarimaZARIMAZarestprintrk   rl   Zgenerate_sampleZy1rf   Zarma1rX   rY   rQ   Zarma1resr(   Zarma2Zres2Zmodelr,   r   r)   ZreslsZerror_estimateZerrlsr   r?   r   rZ   r   rF   r@   rA   Zarma3Zres3r   ro   r   r   r   r   r   ZrandintZar1ZerrgjrZhgjrrm   Zerrgjr2Zhgjr2Zerrgjr3Zhgjr3Zetax3r   Zhgjr4Zetax4r   r   r   r   r   r   r   r   rx   ry   r   r;   r   r   ZwarmupZggmodrb   Zggresr   r3   Zggmod0rG   Zggres0r   r   ZformularK   ZgarchSimZacfZpowerZarma3resZarma3bZ	arma3bresr   ZerroZhoZetaxor   r   Zlltr   r   r   r   r   r   r   rv   Ztseriesr   r   errorZarmodelr   r   r   r   <module>J   st  

r;oj  S


6
?73







&" 4










*
"

"
*(

 

e
<


"