
    M/Ph&I                        d Z ddlZddlmZmZ ddlmZ  G d d          Z	 G d de	          Z
	  G d d	e
          Z G d
 de
          Z G d de
          Z G d de
          Z G d de          Z G d d          Z G d d          Z	 edk    rcdZdZg Zdev r. e	            Ze                    de          Zere ej                      ej        ed         j                  Z ej        ed                             d          d          Z ej        d           d Ze                     ede           Z!erR ej                      ej        e!d         j                  Z ej        e!d         d          Z ej        d!           ej"        #                    e!d          ej$        d"e!d         z  d#z            z
  ej%                  Z& e'e&            ed$d%d&'          Z(e()                    d(d(           Z*er ej                      ej        e*j                  Z ej        e*                    d          d          Z ej        d)            ej                      ej         ej+        e*          j                  Z ej         ej+        e*                    d                    d          Z ej        d*            edd+d'          Z,e,)                    d(d(           Z-erY ej                      ej        e-j                  Z ej        e-                    d          d          Z ej        d,            eddd&d-.          Z.e.)                                Z/e.0                    ddej1        2                    d/0                    Z3e.0                    d ej4        dd1d2          d           e.5                    dd1            e'e.5                    dd1d-d13                              d                     e.5                    dd(d-d(3          Z6erY ej                      ej        e6j                  Z ej        e6                    d          d          Z ej        d4            eddd&d-5          Z7e75                    dd6d-d(3          Z8 e'e8                    d                      e' ej+        e8                    d                               dZerY ej                      ej        e8j                  Z ej        e8                    d          d          Z ej        d7            e'e79                    e8dddf         d-8                     e75                    ddd-d93          Z: e'd:            e;d9          D ](Z< e'e79                    e:e<         d-8                     ) e            Z=e=>                    dd&d;dd$d-<          \  Z?Z@ZAer ej                      ej        e?j                  Z ej        e?                    d          d          Z ej        d=            ej                      ej        eAd>d?@            ej        e?B                    d          dA@            ej        dB            ejC                      eddgej1        j2        ej1        j2        g          ZDeD>                    dCdD           ZE e'eEd         F                    dE          F                    dE                      e'eEd         F                                            e'eEd                             dE                              dE                      e'eEd                                                     e'eEd         jG                    e'eEd         F                                           dS dS )Fa6  getting started with diffusions, continuous time stochastic processes

Author: josef-pktd
License: BSD


References
----------

An Algorithmic Introduction to Numerical Simulation of Stochastic Differential
Equations
Author(s): Desmond J. Higham
Source: SIAM Review, Vol. 43, No. 3 (Sep., 2001), pp. 525-546
Published by: Society for Industrial and Applied Mathematics
Stable URL: http://www.jstor.org/stable/3649798

http://www.sitmo.com/  especially the formula collection


Notes
-----

OU process: use same trick for ARMA with constant (non-zero mean) and drift
some of the processes have easy multivariate extensions

*Open Issues*

include xzero in returned sample or not? currently not

*TODOS*

* Milstein from Higham paper, for which processes does it apply
* Maximum Likelihood estimation
* more statistical properties (useful for tests)
* helper functions for display and MonteCarlo summaries (also for testing/checking)
* more processes for the menagerie (e.g. from empirical papers)
* characteristic functions
* transformations, non-linear e.g. log
* special estimators, e.g. Ait Sahalia, empirical characteristic functions
* fft examples
* check naming of methods, "simulate", "sample", "simexact", ... ?



stochastic volatility models: estimation unclear

finance applications ? option pricing, interest rate models


    N)statssignalc                   (    e Zd ZdZd ZddZddZdS )		Diffusionz:Wiener Process, Brownian Motion with mu=0 and sigma=1
    c                     d S N selfs    a/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/sandbox/tsa/diffusion.py__init__zDiffusion.__init__<           d      Nc                     |dz  |z  }t          j        |d|          }t          j        |          t           j                            ||f          z  }t          j        |d          }|| _        ||fS )z*generate sample of Wiener Process
              ?r   size)nplinspacesqrtrandomnormalcumsumdW)r   nobsTdtnrepltr   Ws           r   	simulateWzDiffusion.simulateW?   sl     sU4ZKAt$$WR[[))t})===IbOO!tr   c                     |                      ||||          \  }} |||          }|                    d          }	||	|fS )zmget expectation of a function of a Wiener Process by simulation

        initially test example from
        r   r   r   r    r   )r#   mean)
r   funcr   r   r   r    r"   r!   UUmeans
             r   expectedsimzDiffusion.expectedsimI   sK    
 ~~415~AA1DAJJq		%{r   r   r   Nr   )__name__
__module____qualname____doc__r   r#   r*   r	   r   r   r   r   9   sU                   r   r   c                   (    e Zd ZdZd Zd	dZd
dZdS )AffineDiffusionz

    differential equation:

    :math::
    dx_t = f(t,x)dt + \sigma(t,x)dW_t

    integral:

    :math::
    x_T = x_0 + \int_{0}^{T}f(t,S)dt + \int_0^T  \sigma(t,S)dW_t

    TODO: check definition, affine, what about jump diffusion?

    c                     d S r   r	   r
   s    r   r   zAffineDiffusion.__init__d   r   r   r   r   Nc                     |                      ||||          \  }}|                                 |                                 |z  z   }t          j        |d          }|                    d          }	||	|fS )Nr%   r   r   )r#   _drift_sigr   r   r&   )
r   r   r   r   r    r"   r!   dxxxmeans
             r   simzAffineDiffusion.simg   si     ~~415~AA1kkmmdiikkAo-Yr!__q		%{r      c           
      "   ||z  }|| j         }||dz  |z  }|                     ||||          \  }}| j        }	t          j        |d|          }||z  }
||z  }t          j        ||f          }|}||dddf<   t          j        d|          D ]|}t          j        |	ddt          j        ||dz
  z  dz   ||z            f         d          }||                     |          z   | 	                    |          |z  z   }||dd|f<   }|S )a7  

        from Higham 2001

        TODO: reverse parameterization to start with final nobs and DT
        TODO: check if I can skip the loop using my way from exactprocess
              problem might be Winc (reshape into 3d and sum)
        TODO: (later) check memory efficiency for large simulations
        Nr   r%   r   r   )r7   )
xzeror#   r   r   r   zerosarangesumr4   r5   )r   r<   r   r   r   r    Tratior"   r!   r   DtLXemXtempjWincs                   r   simEMzAffineDiffusion.simEMp   s;    f} =JE:3tB~~415~AA1WKAt$$BYKhay!!AAAaC1Q 	 	A6"QQQry1aqAAAB1EEDDKK%K000499u93E3E3LLEC!HH
r   r+   )Nr   r   Nr   r:   )r,   r-   r.   r/   r   r9   rG   r	   r   r   r1   r1   S   sU               " " " " " "r   r1   c                   &    e Zd ZdZd ZddZd ZdS )	ExactDiffusionztDiffusion that has an exact integral representation

    this is currently mainly for geometric, log processes

    c                     d S r   r	   r
   s    r   r   zExactDiffusion.__init__   r   r   r      c                 B   t          j        |||z  |          }t          j        | j         |z            }t           j                            ||f          }|                     |          |                     |          |z  z   }t          j	        dgd| g|          S )z`ddt : discrete delta t



        should be the same as an AR(1)
        not tested yet
        r   r   )
r   r   explambdr   r   _exactconst	_exactstdr   lfilter)	r   r<   r   ddtr    r!   expddtnormrvsincs	            r   exactprocesszExactDiffusion.exactprocess   s     KT#Xt,,c)**)""t"55 v&&)?)?')II~rdRL#666r   c                     t          j        | j         |z            }||z  |                     |          z   }|                     |          }t          j        ||          S Nlocscale)r   rM   rN   rO   rP   r   normr   r<   r!   expntmeantstdts         r   	exactdistzExactDiffusion.exactdist   s[    
{Q'' 0 0 7 77~~e$$ze40000r   Nr   rK   )r,   r-   r.   r/   r   rV   ra   r	   r   r   rI   rI      sP           7 7 7 7"1 1 1 1 1r   rI   c                   2    e Zd ZdZd Zd Zd Zd
dZd	 ZdS )ArithmeticBrownianz2
    :math::
    dx_t &= \mu dt + \sigma dW_t
    c                 0    || _         || _        || _        d S r   r<   musigmar   r<   rg   rh   s       r   r   zArithmeticBrownian.__init__       



r   c                     | j         S r   rg   r   argskwdss      r   r4   zArithmeticBrownian._drift   s	    wr   c                     | j         S r   rh   rm   s      r   r5   zArithmeticBrownian._sig   s
    zr   Nr   rK   c                    || j         }t          j        |||z  |          }t          j                            ||f          }| j        | j        t          j        |          z  |z  z   }|t          j        |d          z   S )z7ddt : discrete delta t

        not tested yet
        Nr   r   )	r<   r   r   r   r   r4   _sigmar   r   )r   r   r<   rR   r    r!   rT   rU   s           r   rV   zArithmeticBrownian.exactprocess   sz    
 =JEKT#Xt,,)""t"55kDK"'#,,6@@ryQ''''r   c                     t          j        | j         |z            }| j        |z  }| j        t          j        |          z  }t          j        ||          S rX   )r   rM   rN   r4   rs   r   r   r\   r]   s         r   ra   zArithmeticBrownian.exactdist   sM    
{Q''a{RWQZZ'ze40000r   )Nr   rK   )	r,   r-   r.   r/   r   r4   r5   rV   ra   r	   r   r   rd   rd      sn         
  
    ( ( ( (1 1 1 1 1r   rd   c                   $    e Zd ZdZd Zd Zd ZdS )GeometricBrownianzGeometric Brownian Motion

    :math::
    dx_t &= \mu x_t dt + \sigma x_t dW_t

    $x_t $ stochastic process of Geometric Brownian motion,
    $\mu $ is the drift,
    $\sigma $ is the Volatility,
    $W$ is the Wiener process (Brownian motion).

    c                 0    || _         || _        || _        d S r   rf   ri   s       r   r   zGeometricBrownian.__init__   rj   r   c                 &    |d         }| j         |z  S Nr7   rl   r   rn   ro   r7   s       r   r4   zGeometricBrownian._drift   s    Iw{r   c                 &    |d         }| j         |z  S ry   rq   rz   s       r   r5   zGeometricBrownian._sig       IzA~r   N)r,   r-   r.   r/   r   r4   r5   r	   r   r   rv   rv      sK        
 
  
      r   rv   c                   >    e Zd ZdZd Zd Zd Zd ZddZd	 Z	d
 Z
dS )	OUprocesszOrnstein-Uhlenbeck

    :math::
      dx_t&=\lambda(\mu - x_t)dt+\sigma dW_t

    mean reverting process



    TODO: move exact higher up in class hierarchy
    c                 >    || _         || _        || _        || _        d S r   )r<   rN   rg   rh   )r   r<   rg   rN   rh   s        r   r   zOUprocess.__init__  s"    




r   c                 6    |d         }| j         | j        |z
  z  S ry   )rN   rg   rz   s       r   r4   zOUprocess._drift  s    IzTWq[))r   c                 &    |d         }| j         |z  S ry   rq   rz   s       r   r5   zOUprocess._sig  r|   r   c                     t          j        | j         |z            }||z  | j        d|z
  z  z   | j        t          j        d||z  z
  dz  | j        z            z  |z  z   S Nr          @)r   rM   rN   rg   rh   r   )r   r<   r!   rT   r^   s        r   exactzOUprocess.exact  sk    
 
{Q''1U7 33
RWaemR%7
%BCCCgMN 	Or   r   rK   c                    t          j        |||z  |          }t          j        | j         |z            }t          j        | j         |z            }t           j                            ||f          }ddlm}	 | j        d|z
  z  | j	        t          j
        d||z  z
  dz  | j        z            z  |z  z   }
 |	j        dgd| g|
          S )zddt : discrete delta t

        should be the same as an AR(1)
        not tested yet
        # after writing this I saw the same use of lfilter in sitmo
        r   r   )r   r   r   r   )r   r   rM   rN   r   r   scipyr   rg   rh   r   rQ   )r   r<   r   rR   r    r!   r^   rS   rT   r   rU   s              r   rV   zOUprocess.exactprocess  s     KT#Xt,,
{Q''c)**)""t"55      1V8$
RWavor%9$*%DEEEOP v~rdRL#666r   c                     t          j        | j         |z            }||z  | j        d|z
  z  z   }| j        t          j        d||z  z
  dz  | j        z            z  }ddlm}  |j        ||          S )Nr   r   r   )r   rY   )	r   rM   rN   rg   rh   r   r   r   r\   )r   r<   r!   r^   r_   r`   r   s          r   ra   zOUprocess.exactdist1  s     
{Q''1U7 33zBGQuU{]B$6tz$ABBBuze40000r   c                    t          |          dz
  }t          j        t          j        |          |dd         f          }t          j                            ||dd         d          \  }}}}|\  }	}
||dz
  z  }t          j        |
           |z  }t          j        | dz  t          j        |
          z  d|
dz  z
  z  |z            }|	d|
z
  z  }|||fS )Nassumes data is 1d, univariate time series
        formula from sitmo
        r   Nrcondr   rK   )lenr   column_stackoneslinalglstsqlogr   )r   datar   r   exogparestresranksingconstslopeerrvarrN   rh   rg   s                  r   fitlszOUprocess.fitls:  s    
 4yy{tCRCy9::"$)//$QRR/"K"KT4ud2gr!"RVE]]2QuaxZ@CDDag5%r   Nrb   )r,   r-   r.   r/   r   r4   r5   r   rV   ra   r   r	   r   r   r~   r~      s        
 
  * * *  O O O7 7 7 7(1 1 1         r   r~   c                   B     e Zd ZdZd Zd Zd Zd
 fd	Zd Zd	 Z	 xZ
S )SchwartzOnezthe Schwartz type 1 stochastic process

    :math::
    dx_t = \kappa (\mu - \ln x_t) x_t dt + \sigma x_tdW \

    The Schwartz type 1 process is a log of the Ornstein-Uhlenbeck stochastic
    process.

    c                 L    || _         || _        || _        || _        || _        d S r   )r<   rg   kapparN   rh   )r   r<   rg   r   rh   s        r   r   zSchwartzOne.__init__U  s)    





r   c                 H    d|z
  | j         | j        dz  dz  | j        z  z
  z  S )Nr   rK   r   )rg   rh   r   r   r^   s     r   rO   zSchwartzOne._exactconst\  s*    %DGdj!mb&8$*&DDEEr   c                 \    | j         t          j        d||z  z
  dz  | j        z            z  S r   )rh   r   r   r   r   s     r   rP   zSchwartzOne._exactstd_  s-    zBGQuU{]B$6tz$ABBBBr   r   rK   c                     t          j        |          }t          | j        |                               ||||          }t          j        |          S )z/uses exact solution for log of process
        rR   r    )r   r   super	__class__rV   rM   )r   r<   r   rR   r    lnxzerolnxr   s          r   rV   zSchwartzOne.exactprocessb  sI     &--DND))66udSX6YYvc{{r   c                     t          j        | j         |z            }t          j        |          |z  |                     |          z   }|                     |          }t          j        ||          S rX   )r   rM   rN   r   rO   rP   r   lognormr]   s         r   ra   zSchwartzOne.exactdisti  sd    
{Q''u%(8(8(?(??~~e$$}d3333r   c                    t          |          dz
  }t          j        t          j        |          t          j        |dd                   f          }t          j                            |t          j        |dd                   d          \  }}}}|\  }	}
||dz
  z  }t          j        |
           |z  }t          j        ||z  dt          j        d|z  |z            z
  z            }|	dt          j        | |z            z
  z  |dz  dz  |z  z   }t          j	        |          dk    r|d	         }t          j	        |          dk    r|d	         }|||fS )
r   r   Nr   r   r   rK   r   r   )
r   r   r   r   r   r   r   r   rM   shape)r   r   r   r   r   r   r   r   r   r   r   r   r   rh   rg   s                  r   r   zSchwartzOne.fitlsp  sE   
 4yy{bfT#2#Y.?.?@AA"$)//$tABBx8H8HPR/"S"ST4ud2gr!!BF2e8B;,?,?*?@AAavby)))*UAXb[->>8B<<$AB8E??T!!!HE5%r   rb   )r,   r-   r.   r/   r   rO   rP   rV   ra   r   __classcell__)r   s   @r   r   r   J  s           F F FC C C     4 4 4             r   r   c                       e Zd Zd ZddZdS )BrownianBridgec                     d S r   r	   r
   s    r   r   zBrownianBridge.__init__  r   r   r   r   c                 n   |dz   }|dz  |z  }t          j        |||z
  |          }t          j        |||          }||z  d||z  z
  g}	d|||z
  z  z
  }
||||z
  z  z  }|t          j        |d|z
  z  |z            z  }|t          j        |||z
  |z
  z  ||z
  z            z  }t          j        ||f          }||d d df<   |t           j                            ||f          z  }t          d|          D ]7}|d d |dz
  f         |
|         z  ||         z   |d d |f         z   |d d |f<   8|||fS )Nr   r   r   r   )r   r   r   r=   r   r   range)r   x0x1r   r    rR   rh   r   r!   wmwmiwm1susr7   rvsis                    r   simulatezBrownianBridge.simulate  sq   !VVD[KCFD))KC&&eQquW CE
l"c!e*oBGAqsGCK(((272s1uRx=#a%0111HeT]##!!!A#	  uTl 333q 	9 	9Aqqq1uXc!f_s1v-AAAaC8AaaacFF!Rxr   N)r   r   r   )r,   r-   r.   r   r   r	   r   r   r   r     s7               r   r   c                   8    e Zd ZdZej        j        fdZddZdS )CompoundPoissonzCnobs iid compound poisson distributions, not a process in time
    c                     t          |          t          |          k    rt          d          t          |          | _        || _        t	          j        |          | _        d S )Nz9lambd and randfn need to have the same number of elements)r   
ValueErrornobjrandfnr   asarrayrN   )r   rN   r   s      r   r   zCompoundPoisson.__init__  sQ    u::V$$XYYYJJ	Z&&


r   r   c                 d   | j         }t          j        |||f          }t          j                            | j        d d d d f         |||f          }t          |          D ]}| j        |         }|d d d d |f         } |||t          j        |          f          }	t          d|	
                                |	j                   |	                    d          t          j        |          d d d f         t          j        |          |dz
  f         }
|
|d d d d |f<   d||dk    <   ||fS )Nr   z	rvs.sum()r   r   r   )r   r   r=   r   poissonrN   r   r   maxprintr?   r   r   r>   )r   r   r    r   r7   Niorandfncncr   xios              r   r   zCompoundPoisson.simulate  s4   yHeT4())Idjd1115U4<MNN++ 
	 
	Bk"oG111QQQr6B 'd26"::6777C+swwyy#)444**R..5!1!1!!!D&!9")D//"Q$!NOCAaaa"fII!Q$!tr   Nr   )	r,   r-   r.   r/   r   r   r   r   r   r	   r   r   r   r     sN         %'Y%5 ' ' ' '     r   r   __main__r   i  all)r    rK   )	linewidthz)Standard Brownian Motion (Wiener Process)c                 6    t          j        | d|z  z             S )N      ?)r   rM   )r!   r"   s     r   <lambda>r     s    BF1s1u9-- r   i  )r   r    zBrownian Motion - exp	   g       @r   g{Gz?r   rf   r   zGeometric Brownianz$Geometric Brownian - log-transformedg?zArithmetic Browniang?)r<   rg   rN   rh   )   
   r   r   g      Y@r   zOrnstein-Uhlenbeck)r<   rg   r   rh   2   zSchwartz One)r   r   z true: mu=1, kappa=0.5, sigma=0.1c   )r    rR   rh   zBrownian Bridgertheoretical)label	simulatedzBrownian Bridge - Variancei N     r   )Hr/   numpyr   r   r   r   matplotlib.pyplotpyplotpltr   r1   rI   rd   rv   r~   r   r   r   r,   doplotr    exampleswr#   wsfigureplotr   tmpr&   titler'   r*   usr   r\   rM   infaverrr   gbrG   gbsr   ababsouousr   r   r   ouer   rV   ouessososr   sos2r   r   bbr   bbsr!   r   stdlegendcpcpsr?   r   r	   r   r   <module>r     sD	  1 1d                         4? ? ? ? ?i ? ? ?B	1 1 1 1 1_ 1 1 1B 1  1  1  1  1  1  1  1F       2K  K  K  K  K  K  K  K \8  8  8  8  8 . 8  8  8 x       0       J$ zFEHIKK
 [[U[++ 	CCJLLL#(2a57##C#(2a5::a==A666CCIABBB--]]4c]77 	/CJLLL#(2a57##C#(2a5A...CCI-...	r!uvrva1gbj'9'9926BBe RD<<<hhCsh++ 	>CJLLL#(35//C#(388A;;!444CCI*+++CJLLL#(626#;;=))C#(626#((1++..!<<<CCI<===aD:::hhCsh++ 	-CJLLL#(35//C#(388A;;!444CCI+,,,
 YQ1Cs;;;hhjjhhq!RY--6-::;;
KBK"V,,a000
"booa"o55::1==>>>q#C88 	,CJLLL#(46""C#(499Q<<1555CCI*+++
 [qQc===ooa#o66chhqkkfbfSXXa[[!!""" 	&CJLLL#(35//C#(388A;;!444CCIn%%%bhhs1QQQ3x3h''(((q#A660111q 	, 	,AE"((47c(**++++ ^[[C3Bc[JJ
Q 		CJLLL#(35//C#(388A;;!444CCI'(((CJLLLCHR=1111CHSWWQZZ{3333CI2333CJLLL 
!A!1")2B C	D	DB
++5q+
)
)C	E#a&**R..

R
 
 !!!	E#a&**,,	E#a&++b//

r
"
"###	E#a&++--	E#a&+	E#a&**,,m r   