Ë
    £�DjvK  ã                   ó  — 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(  �rdZdZg Zdev �r	 e	«       Zej/                  de¬«      Zerh ej2                  «         ej4                  ed   j6                  «      Z ej4                  ed   j;                  d«      d¬«      Z ej<                  d«       d„ ZejA                  ede¬ «      Z!erY ej2                  «         ej4                  e!d   j6                  «      Z ej4                  e!d   d¬«      Z ej<                  d!«       ejD                  jG                  e!d    ejH                  d"e!d   z  d#z  «      z
  ejJ                  «      Z& e'e&«        ed$d%d&¬'«      Z(e(jS                  d(d(¬ «      Z*erä ej2                  «         ej4                  e*j6                  «      Z ej4                  e*j;                  d«      d¬«      Z ej<                  d)«        ej2                  «         ej4                   ejV                  e*«      j6                  «      Z ej4                   ejV                  e*j;                  d«      «      d¬«      Z ej<                  d*«        edd+d¬'«      Z,e,jS                  d(d(¬ «      Z-erb ej2                  «         ej4                  e-j6                  «      Z ej4                  e-j;                  d«      d¬«      Z ej<                  d,«        eddd&d-¬.«      Z.e.jS                  «       Z/e.ja                  ddejb                  je                  d/¬0«      «      Z3e.ja                  d ejh                  dd1d2«      d«       e.jk                  dd1«        e'e.jk                  dd1d-d1¬3«      j;                  d«      «       e.jk                  dd(d-d(¬3«      Z6erb ej2                  «         ej4                  e6j6                  «      Z ej4                  e6j;                  d«      d¬«      Z ej<                  d4«        eddd&d-¬5«      Z7e7jk                  dd6d-d(¬3«      Z8 e'e8j;                  d«      «        e' ejV                  e8j;                  d«      «      «       dZerb ej2                  «         ej4                  e8j6                  «      Z ej4                  e8j;                  d«      d¬«      Z ej<                  d7«        e'e7js                  e8ddd…f   d-¬8«      «       e7jk                  ddd-d9¬3«      Z: e'd:«        e;d9«      D ]  Z< e'e7js                  e:e<   d-¬8«      «       Œ   e«       Z=e=j}                  dd&d;dd$d-¬<«      \  Z?Z@ZAerÎ ej2                  «         ej4                  e?j6                  «      Z ej4                  e?j;                  d«      d¬«      Z ej<                  d=«        ej2                  «         ej4                  eAd>d?¬@«        ej4                  e?j…                  d«      dA¬@«        ej<                  dB«        ej†                  «         eddgejb                  jd                  ejb                  jd                  g«      ZDeDj}                  dCdD¬ «      ZE e'eEd   j�                  dE«      j�                  dE«      «        e'eEd   j�                  «       «        e'eEd   j;                  dE«      j;                  dE«      «        e'eEd   j;                  «       «        e'eEd   jŽ                  «        e'eEd   j�                  «       «       yy)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y)Ú	Diffusionz:Wiener Process, Brownian Motion with mu=0 and sigma=1
    c                  ó   — y ©N© ©Úselfs    úeC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\statsmodels/sandbox/tsa/diffusion.pyÚ__init__zDiffusion.__init__<   ó   € Øó    Nc                 óò   — |dz  |z  }t        j                  |d|«      }t        j                  |«      t         j                  j	                  ||f¬«      z  }t        j
                  |d«      }|| _        ||fS )z*generate sample of Wiener Process
        ç      ð?é   ©Úsize)ÚnpÚlinspaceÚsqrtÚrandomÚnormalÚcumsumÚdW)r   ÚnobsÚTÚdtÚnreplÚtr   ÚWs           r   Ú	simulateWzDiffusion.simulateW?   sj   € ð ˆs‰U�4‰ZˆÜ�K‰K˜˜A˜tÓ$ˆÜ�W‰W�R‹[œŸ™×)Ñ)°°t¨}Ð)Ó=Ñ=ˆÜ�I‰I�b˜‹OˆØˆŒØ�!ˆtˆr   c                 óp   — | j                  ||||¬«      \  }} |||«      }|j                  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   sB   € ð
 �~‰~ 4¨1°¸5ˆ~ÓA‰ˆˆ1Ù��A‹JˆØ—‘�q“	ˆØ�%˜ˆ{Ðr   ©éd   r   Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r)   r	   r   r   r   r   9   s   „ ñòóôr   r   c                   ó&   — e Zd ZdZd„ Zdd„Zdd„Zy)Ú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                  ó   — y r   r	   r
   s    r   r   zAffineDiffusion.__init__d   r   r   Nc                 óÒ   — | j                  ||||¬«      \  }}| j                  «       | j                  «       |z  z   }t        j                  |d«      }|j                  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   s`   € ð �~‰~ 4¨1°¸5ˆ~ÓA‰ˆˆ1Ø�k‰k‹m˜dŸi™i›k¨A™oÑ-ˆÜ�Y‰Y�r˜!‹_ˆØ—‘�q“	ˆØ�%˜ˆ{Ðr   c           
      ó&  — ||z  }|€| j                   }|€|dz  |z  }| j                  ||||¬«      \  }}| j                  }	t        j                  |d|«      }||z  }
||z  }t        j
                  ||f«      }|}||dd…df<   t        j                  d|«      D ]s  }t        j                  |	dd…t        j                  ||dz
  z  dz   ||z  «      f   d«      }|| j                  |¬«      z   | j                  |¬«      |z  z   }||dd…|f<   Œu |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‰}ˆð ˆ=Ø—J‘JˆEØˆ:Ø�3‘�t‘ˆBØ�~‰~ 4¨1°¸5ˆ~ÓA‰ˆˆ1Ø�W‰WˆÜ�K‰K˜˜A˜tÓ$ˆØ�B‰YˆØ�‰KˆÜ�h‰h˜˜a�yÓ!ˆØˆØˆŠAˆaˆC‰Ü—‘˜1˜Q“ò 	ˆAä—6‘6˜"šQœrŸy™y¨°°1±©°a©¸¸q¹ÓAÐAÑBÀ1ÓEˆDà˜DŸK™K¨%˜KÓ0Ñ0°4·9±9¸u°9Ó3EÈÑ3LÑLˆEàˆC’�!�ŠHð	ð ˆ
r   r*   )Nr+   r   Nr   é   )r,   r-   r.   r/   r   r9   rF   r	   r   r   r1   r1   S   s   „ ñò óô"r   r1   c                   ó$   — e Zd ZdZd„ Zdd„Zd„ Zy)ÚExactDiffusionztDiffusion that has an exact integral representation

    this is currently mainly for geometric, log processes

    c                  ó   — y r   r	   r
   s    r   r   zExactDiffusion.__init__¦   r   r   c                 óB  — t        j                  |||z  |«      }t        j                  | j                   |z  «      }t         j                  j                  ||f¬«      }| j                  |«      | j                  |«      |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‰K˜˜T #™X tÓ,ˆä—‘˜Ÿ™˜ cÑ)Ó*ˆÜ—)‘)×"Ñ"¨¨t¨Ð"Ó5ˆð ×Ñ˜vÓ&¨¯©¸Ó)?À'Ñ)IÑIˆÜ�~‰~˜r˜d R¨¨ L°#Ó6Ð6r   c                 óÆ   — t        j                  | j                   |z  «      }||z  | j                  |«      z   }| j	                  |«      }t        j                  ||¬«      S ©N©ÚlocÚscale)r   rL   rM   rN   rO   r   Únorm©r   r;   r    ÚexpntÚmeantÚstdts         r   Ú	exactdistzExactDiffusion.exactdistº   sR   € Ü—‘˜Ÿ
™
�{ Q‘Ó'ˆØ˜‘ × 0Ñ 0°Ó 7Ñ7ˆØ�~‰~˜eÓ$ˆÜ�z‰z˜e¨4Ô0Ð0r   N©r   é   )r,   r-   r.   r/   r   rU   r`   r	   r   r   rI   rI   Ÿ   s   „ ñòó7ó"1r   rI   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zd„ Zy)	ÚArithmeticBrownianz2
    :math::
    dx_t &= \mu dt + \sigma dW_t
    c                 ó.   — || _         || _        || _        y 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‰wˆr   c                 ó   — | j                   S r   ©rh   rm   s      r   r5   zArithmeticBrownian._sigÍ   s   € Ø�z‰zÐr   Nc                 ó,  — |€| j                   }t        j                  |||z  |«      }t        j                  j	                  ||f¬«      }| j
                  | j                  t        j                  |«      z  |z  z   }|t        j                  |d«      z   S )z7ddt : discrete delta t

        not tested yet
        r   r   )	r;   r   r   r   r   r4   Ú_sigmar   r   )r   r   r;   rQ   r   r    rS   rT   s           r   rU   zArithmeticBrownian.exactprocessÏ   s}   € ð
 ˆ=Ø—J‘JˆEÜ�K‰K˜˜T #™X tÓ,ˆÜ—)‘)×"Ñ"¨¨t¨Ð"Ó5ˆØ�k‰k˜DŸK™K¬"¯'©'°#«,Ñ6¸Ñ@Ñ@ˆà”r—y‘y  QÓ'Ñ'Ð'r   c                 óØ   — t        j                  | j                   |z  «      }| j                  |z  }| j                  t        j
                  |«      z  }t        j                  ||¬«      S rW   )r   rL   rM   r4   rs   r   r   r[   r\   s         r   r`   zArithmeticBrownian.exactdistÜ   sN   € Ü—‘˜Ÿ
™
�{ Q‘Ó'ˆØ—‘˜a‘ˆØ�{‰{œRŸW™W Q›ZÑ'ˆÜ�z‰z˜e¨4Ô0Ð0r   )Nr   rb   )	r,   r-   r.   r/   r   r4   r5   rU   r`   r	   r   r   rd   rd   À   s    „ ñò
ò
òó(ó1r   rd   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚGeometricBrownianzýGeometric 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                 ó.   — || _         || _        || _        y 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‰w˜‰{Ðr   c                 ó*   — |d   }| j                   |z  S ry   rq   rz   s       r   r5   zGeometricBrownian._sig÷   ó   € Ø�‰IˆØ�z‰z˜A‰~Ðr   N)r,   r-   r.   r/   r   r4   r5   r	   r   r   rv   rv   ã   s   „ ñ
òò
ór   rv   c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd
d„Zd„ Z	d„ Z
y	)Ú	OUprocessz¢Ornstein-Uhlenbeck

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

    mean reverting process



    TODO: move exact higher up in class hierarchy
    c                 ó<   — || _         || _        || _        || _        y r   )r;   rM   rg   rh   )r   r;   rg   rM   rh   s        r   r   zOUprocess.__init__  s   € ØˆŒ
ØˆŒ
ØˆŒØˆ�
r   c                 óD   — |d   }| j                   | j                  |z
  z  S ry   )rM   rg   rz   s       r   r4   zOUprocess._drift  s"   € Ø�‰IˆØ�z‰z˜TŸW™W q™[Ñ)Ð)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   rL   rM   rg   rh   r   )r   r;   r    rS   r]   s        r   ÚexactzOUprocess.exact  sq   € ô
 —‘˜Ÿ
™
�{ Q‘Ó'ˆØ˜‘ §¡¨1¨U©7Ñ 3Ñ3Ø—
‘
œRŸW™W a¨¨e©¡m°RÑ%7¸¿
¹
Ñ%BÓCÑCÀgÑMñNð 	Or   c                 óÞ  — t        j                  |||z  |«      }t        j                  | j                   |z  «      }t        j                  | j                   |z  «      }t         j                  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 )z¢ddt : 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   rL   rM   r   r   Úscipyr   rg   rh   r   rP   )r   r;   r   rQ   r   r    r]   rR   rS   r   rT   s              r   rU   zOUprocess.exactprocess  sÐ   € ô �K‰K˜˜T #™X tÓ,ˆÜ—‘˜Ÿ
™
�{ Q‘Ó'ˆÜ—‘˜Ÿ™˜ cÑ)Ó*ˆÜ—)‘)×"Ñ"¨¨t¨Ð"Ó5ˆå à—‘˜1˜V™8Ñ$Ø—
‘
œRŸW™W a¨¨v©¡o°rÑ%9¸$¿*¹*Ñ%DÓEÑEÈÑOñPˆð ˆv�~‰~˜r˜d R¨¨ L°#Ó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   rX   )	r   rL   rM   rg   rh   r   r‡   r   r[   )r   r;   r    r]   r^   r_   r   s          r   r`   zOUprocess.exactdist1  sz   € ô —‘˜Ÿ
™
�{ Q‘Ó'ˆØ˜‘ §¡¨1¨U©7Ñ 3Ñ3ˆØ�z‰zœBŸG™G Q u¨U¡{¡]°BÑ$6°t·z±zÑ$AÓBÑBˆÝØˆu�z‰z˜e¨4Ô0Ð0r   c                 ó¨  — t        |«      dz
  }t        j                  t        j                  |«      |dd f«      }t        j                  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„   rb   )Úlenr   Úcolumn_stackÚonesÚlinalgÚlstsqÚlogr   )r   Údatar   r   ÚexogÚparestÚresÚrankÚsingÚconstÚslopeÚerrvarrM   rh   rg   s                  r   ÚfitlszOUprocess.fitls:  sÑ   € ô
 �4‹y˜‰{ˆÜ�‰¤§¡¨£¨t°C°R¨yÐ9Ó:ˆÜ"$§)¡)§/¡/°$¸¸Q¸R¸È /Ó"KÑˆ��T˜4Ø‰ˆˆuØ�d˜2‘g‘ˆÜ—‘˜“�˜rÑ!ˆÜ—‘˜˜ "™¤R§V¡V¨E£]Ñ2°Q°u¸a±x±ZÑ@ÀÑCÓDˆØ�a˜‘gÑˆØ�5˜%ÐÐr   Nra   )r,   r-   r.   r/   r   r4   r5   r…   rU   r`   r�   r	   r   r   r~   r~   ü   s+   „ ñ
òò*òòOó7ò(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 )	ÚSchwartzOnezÏthe 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                 óJ   — || _         || _        || _        || _        || _        y r   )r;   rg   ÚkapparM   rh   )r   r;   rg   r¡   rh   s        r   r   zSchwartzOne.__init__U  s%   € ØˆŒ
ØˆŒØˆŒ
ØˆŒ
Øˆ�
r   c                 óf   — d|z
  | j                   | j                  dz  dz  | j                  z  z
  z  S )Nr   rb   r„   )rg   rh   r¡   ©r   r]   s     r   rN   zSchwartzOne._exactconst\  s0   € Ø�%‘˜DŸG™G d§j¡j°!¡m°bÑ&8¸$¿*¹*Ñ&DÑDÑEÐEr   c                 ór   — | j                   t        j                  d||z  z
  dz  | j                  z  «      z  S rƒ   )rh   r   r   r¡   r£   s     r   rO   zSchwartzOne._exactstd_  s0   € Ø�z‰zœBŸG™G Q u¨U¡{¡]°BÑ$6°t·z±zÑ$AÓBÑBÐBr   c                 ó’   •— t        j                  |«      }t        | j                  | �  ||||¬«      }t        j
                  |«      S )z/uses exact solution for log of process
        ©rQ   r   )r   r“   ÚsuperÚ	__class__rU   rL   )r   r;   r   rQ   r   ÚlnxzeroÚlnxr¨   s          €r   rU   zSchwartzOne.exactprocessb  s?   ø€ ô —&‘&˜“-ˆÜ�D—N‘N DÑ6°u¸dÈÐSXÐ6ÓYˆÜ�v‰v�c‹{Ðr   c                 óì   — t        j                  | j                   |z  «      }t        j                  |«      |z  | j	                  |«      z   }| j                  |«      }t        j                  ||¬«      S rW   )r   rL   rM   r“   rN   rO   r   Úlognormr\   s         r   r`   zSchwartzOne.exactdisti  s[   € Ü—‘˜Ÿ
™
�{ Q‘Ó'ˆä—‘�u“ Ñ%¨×(8Ñ(8¸Ó(?Ñ?ˆØ�~‰~˜eÓ$ˆÜ�}‰} ¨dÔ3Ð3r   c                 ó¦  — t        |«      dz
  }t        j                  t        j                  |«      t        j                  |dd «      f«      }t        j
                  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„   éþÿÿÿrb   ©r   r   )
rŽ   r   r�   r�   r“   r‘   r’   r   rL   Úshape)r   r”   r   r   r•   r–   r—   r˜   r™   rš   r›   rœ   r¡   rh   rg   s                  r   r�   zSchwartzOne.fitlsp  s2  € ô
 �4‹y˜‰{ˆÜ�‰¤§¡¨£¬b¯f©f°T¸#¸2°YÓ.?Ð@ÓAˆÜ"$§)¡)§/¡/°$¼¿¹¸tÀAÀB¸xÓ8HÐPR /Ó"SÑˆ��T˜4Ø‰ˆˆuØ�d˜2‘g‘ˆÜ—‘˜“�˜rÑ!ˆÜ—‘˜ ™¨!¬B¯F©F°2°e±8¸B±;Ó,?Ñ*?Ñ@ÓAˆØ�aœŸ™ ˜v b™yÓ)Ñ)Ñ*¨U°A©X°b©[¸Ñ->Ñ>ˆÜ�8‰8�B‹<˜$ÒØ�A‘ˆBÜ�8‰8�E‹?˜TÒ!Ø˜!‘HˆEà�5˜%ÐÐr   ra   )r,   r-   r.   r/   r   rN   rO   rU   r`   r�   Ú__classcell__)r¨   s   @r   rŸ   rŸ   J  s(   ø„ ñòòFòCõò4ö r   rŸ   c                   ó   — e Zd Zd„ Zdd„Zy)ÚBrownianBridgec                  ó   — y r   r	   r
   s    r   r   zBrownianBridge.__init__‡  r   r   c                 ó\  — |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                  j                  ||f¬«      z  }t        d|«      D ]+  }|d d …|dz
  f   |
|   z  ||   z   |d d …|f   z   |d d …|f<   Œ- |||fS )Nr   r   r   r   )r   r   r   r<   r   r   Úrange)r   Úx0Úx1r   r   rQ   rh   r   r    ÚwmÚwmiÚwm1ÚsuÚsr7   ÚrvsÚis                    r   ÚsimulatezBrownianBridge.simulateŠ  sW  € Ø�!‰VˆØ�‰V�D‰[ˆÜ�K‰K˜˜C ™F DÓ)ˆÜ�K‰K˜˜C Ó&ˆØ�‰e�Q�q˜‘u‘WÐˆð ��C˜‘E‘
‰lˆØ�"�c˜!‘e‘*‰oˆØ”B—G‘G˜A˜q ™s™G C™KÓ(Ñ(ˆØ”2—7‘7˜2˜s 1™u R™x™=¨#¨a©%Ñ0Ó1Ñ1ˆÜ�H‰H�e˜T�]Ó#ˆØˆŠ!ˆAˆ#‰Ø”—	‘	× Ñ  u¨T lÐ Ó3Ñ3ˆÜ�q˜“ò 	9ˆAØ’q˜˜1™�u‘X˜c !™f‘_ s¨1¡vÑ-°²A°a°C±Ñ8ˆAŠa�ˆcŠFð	9à�!�Rˆxˆr   N)r   r   r   )r,   r-   r.   r   rÀ   r	   r   r   r³   r³   †  s   „ òôr   r³   c                   óJ   — e Zd ZdZej
                  j                  fd„Zdd„Zy)ÚCompoundPoissonzCnobs iid compound poisson distributions, not a process in time
    c                 óª   — t        |«      t        |«      k7  rt        d«      ‚t        |«      | _        || _        t	        j
                  |«      | _        y )Nz9lambd and randfn need to have the same number of elements)rŽ   Ú
ValueErrorÚnobjÚrandfnr   ÚasarrayrM   )r   rM   rÆ   s      r   r   zCompoundPoisson.__init__¡  s@   € Üˆu‹:œ˜V›Ò$ÜÐXÓYÐYä˜“JˆŒ	ØˆŒÜ—Z‘Z Ó&ˆ�
r   c                 óR  — | j                   }t        j                  |||f«      }t        j                  j	                  | j
                  d d d d …f   |||f¬«      }t        |«      D ]´  }| j                  |   }|d d …d d …|f   } |||t        j                  |«      f¬«      }	t        d|	j                  «       |	j                  «       |	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   ÚpoissonrM   r¶   rÆ   ÚmaxÚprintr>   r°   r   r=   )r   r   r   rÅ   r7   ÚNÚioÚrandfncÚncr¾   Úxios              r   rÀ   zCompoundPoisson.simulate©  s  € Ø�y‰yˆÜ�H‰H�e˜T 4Ð(Ó)ˆÜ�I‰I×Ñ˜dŸj™j¨¨d²1¨Ñ5¸UÀ4ÈÐ<MÐÓNˆÜ˜“+ò 
	ˆBØ—k‘k "‘oˆGà’1’Q�r�6‘ˆBñ   d¬2¯6©6°"«:Ð6Ô7ˆCÜ�+˜sŸw™w›y¨#¯)©)Ô4Ø—*‘*˜R“.¤§¡¨5Ó!1²!°D°&Ñ!9¼"¿)¹)ÀD»/È"ÈQÉ$Ð!NÑOˆCàˆAŠa’�"ˆfŠIð
	ð ˆˆ!ˆQ‰$‰Ø�!ˆtˆr   Nr¯   )	r,   r-   r.   r/   r   r   r   r   rÀ   r	   r   r   rÂ   rÂ   ž  s   „ ñà%'§Y¡Y×%5Ñ%5ó 'ôr   rÂ   Ú__main__r   iè  Úall)r   rb   )Ú	linewidthz)Standard Brownian Motion (Wiener Process)c                 ó8   — t        j                  | d|z  z   «      S )Nç      à?)r   rL   )r    r!   s     r   ú<lambda>rÖ   ç  s   € œBŸF™F 1 s¨1¡u¡9Ó-€ r   iô  )r   r   zBrownian Motion - expé	   g       @r   g{®Gáz„?rÕ   rf   r+   zGeometric Brownianz$Geometric Brownian - log-transformedgš™™™™™©?zArithmetic Browniangš™™™™™¹?)r;   rg   rM   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.1éc   )r   rQ   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[   rL   ÚinfÚaverrrË   ÚgbrF   Úgbsr“   ÚabÚabsÚouÚousr…   r   r   Úouer   rU   ÚouesÚsoÚsosr�   Úsos2r¶   r¿   ÚbbrÀ   Úbbsr    r¹   ÚstdÚlegendÚcpÚcpsr>   r   r	   r   r   ú<module>r     sy  ðñ1ód ß Ý ÷ñ ô4?�iô ?ðB	ô1�_ô 1ôB 1˜ô  1ôF˜ô ô2K �ô K ô\8 �.ô 8 ÷xñ ÷0ñ ðJð$ ˆzÓØ€FØ€EØ€Hà�ÒÙ‹Kˆð
 �[‰[˜ Uˆ[Ó+ˆÙØˆC�J‰JŒLØ�#—(‘(˜2˜a™5Ÿ7™7Ó#ˆCØ�#—(‘(˜2˜a™5Ÿ:™: a›=°AÔ6ˆCØˆC�I‰IÐAÔBá-ˆØ�]‰]˜4 c°ˆ]Ó7ˆÙØˆC�J‰JŒLØ�#—(‘(˜2˜a™5Ÿ7™7Ó#ˆCØ�#—(‘(˜2˜a™5¨AÔ.ˆCØˆC�I‰IÐ-Ô.à—	‘	—‘˜r !™u v r§v¡v¨a°°1±©g°b©jÓ'9Ñ9¸2¿6¹6ÓBˆÙˆeŒñ  R¨D¸Ô<ˆØ�h‰h˜C sˆhÓ+ˆÙØˆC�J‰JŒLØ�#—(‘(˜3Ÿ5™5“/ˆCØ�#—(‘(˜3Ÿ8™8 A›;°!Ô4ˆCØˆC�I‰IÐ*Ô+ØˆC�J‰JŒLØ�#—(‘(˜6˜2Ÿ6™6 #›;Ÿ=™=Ó)ˆCØ�#—(‘(˜6˜2Ÿ6™6 #§(¡(¨1£+Ó.¸!Ô<ˆCØˆC�I‰IÐ<Ô=á a¨D¸Ô:ˆØ�h‰h˜C sˆhÓ+ˆÙØˆC�J‰JŒLØ�#—(‘(˜3Ÿ5™5“/ˆCØ�#—(‘(˜3Ÿ8™8 A›;°!Ô4ˆCØˆC�I‰IÐ+Ô,ñ
 ˜Q 1¨C°sÔ;ˆØ�h‰h‹jˆØ�h‰h�q˜!˜RŸY™Y×-Ñ-°6Ð-Ó:Ó;ˆØ
�‰��K�B—K‘K  " VÓ,¨aÔ0Ø
�‰˜˜"ÔÙˆb�o‰o˜a ¨°"ˆoÓ5×:Ñ:¸1Ó=Ô>à�‰˜q ¨#°CˆÓ8ˆÙØˆC�J‰JŒLØ�#—(‘(˜4Ÿ6™6Ó"ˆCØ�#—(‘(˜4Ÿ9™9 Q›<°1Ô5ˆCØˆC�I‰IÐ*Ô+ñ
 ˜q Q¨c¸Ô=ˆØ�o‰o˜a ¨°#ˆoÓ6ˆÙˆc�h‰h�q‹kÔÙˆfˆb�f‰f�S—X‘X˜a“[Ó!Ô"ØˆÙØˆC�J‰JŒLØ�#—(‘(˜3Ÿ5™5“/ˆCØ�#—(‘(˜3Ÿ8™8 A›;°!Ô4ˆCØˆC�I‰I�nÔ%Ùˆb�h‰h�s˜1šQ˜3‘x 3ˆhÓ'Ô(Ø�‰˜q ¨#°AˆÓ6ˆÙÐ0Ô1Ù�q“ò 	,ˆAÙ�"—(‘(˜4 ™7 c�(Ó*Õ+ð	,ñ Óˆà—[‘[  C¨°3¸BÀc�[ÓJ‰
ˆˆQ�ÙØˆC�J‰JŒLØ�#—(‘(˜3Ÿ5™5“/ˆCØ�#—(‘(˜3Ÿ8™8 A›;°!Ô4ˆCØˆC�I‰IÐ'Ô(ØˆC�J‰JŒLØˆC�H‰H�R˜ =Õ1ØˆC�H‰H�S—W‘W˜Q“Z {Õ3ØˆC�I‰IÐ2Ô3ØˆC�J‰JŒLñ 
˜!˜A˜ §¡×!1Ñ!1°"·)±)×2BÑ2BÐ CÓ	D€BØ
�+‰+˜5 qˆ+Ó
)€CÙ	ˆ#ˆa‰&�*‰*�R‹.×
Ñ
˜RÓ
 Ô!Ù	ˆ#ˆa‰&�*‰*‹,ÔÙ	ˆ#ˆa‰&�+‰+�b‹/×
Ñ
˜rÓ
"Ô#Ù	ˆ#ˆa‰&�+‰+‹-ÔÙ	ˆ#ˆa‰&�+‰+ÔÙ	ˆ#ˆa‰&�*‰*‹,Õðm r   