32 votos

Implementación de Ornstein-Uhlenbeck en Matlab

Estoy leyendo este artículo en Wikipedia, donde se trazan tres trayectorias de muestra de diferentes procesos OU. Me gustaría hacer lo mismo para aprender cómo funciona, pero me encuentro con problemas para implementarlo en Matlab.

Creo que tengo que discretizar esta ecuación de alguna manera: $ x_t = x_0 e^{-\theta t} + \mu(1-e^{-\theta t}) + \int_0^t \sigma e^{\theta (s)}\, \mathrm{d}W_s. \, $ , pero especialmente la ecuación integral me confunde mucho.

También creo que tendré que usar $W_t = W_t-W_0 \sim N(0,t)$ de alguna manera, pero aún no sé cómo...

¿Puede alguien ayudarme? Soy nuevo en el cálculo estocástico, así que por favor ayúdenme a entender paso a paso.

53voto

solusipse Puntos 145

El Artículo de Wikipedia que citas proporciona todo lo necesario para evaluar la solución analítica del proceso Ornstein-Uhlenbeck. Sin embargo, para un principiante, estoy de acuerdo en que puede no ser muy claro.

1. Simulación del proceso Ornstein-Uhlenbeck

En primer lugar, debe familiarizarse con la forma de simular este proceso utilizando el Euler-Maruyama método. La ecuación diferencial estocástica (EDE)

$$\mathrm{d}x_t = \theta (\mu - x_t)\mathrm{d}t + \sigma \mathrm{d}W_t$$

se puede discretizar y aproximar mediante

$$ X_{n+1} = X_n + \theta (\mu - X_n)\Delta t + \sigma \Delta W_n$$

donde $\Delta W_n$ son independientes idénticamente distribuidos Incrementos de Wiener , es decir, variantes normales con media y varianza nulas $\Delta t$ . Así, $W_{t_{n+1}}-W_{t_n} = \Delta W_n \sim N(0,\Delta t) = \sqrt{\Delta t} \space N(0,1)$ . Esto se puede simular en Matlab muy fácilmente utilizando randn para generar variantes normales estándar:

th = 1;
mu = 1.2;
sig = 0.3;
dt = 1e-2;
t = 0:dt:2;             % Time vector
x = zeros(1,length(t)); % Allocate output vector, set initial condition
rng(1);                 % Set random seed
for i = 1:length(t)-1
    x(i+1) = x(i)+th*(mu-x(i))*dt+sig*sqrt(dt)*randn;
end
figure;
plot(t,x);

lo que dará como resultado un gráfico similar al rastro azul en el artículo de Wikipedia (no será idéntico porque se utilizaron diferentes valores aleatorios - ver también mis comentarios debajo de esta respuesta). Tenga en cuenta que lo anterior no es el código más eficiente.

2. Solución en términos de integral

La ecuación de su pregunta está en términos de una integral estocástica

$$x_t = x_0 e^{-\theta t} + \mu (1-e^{-\theta t}) + \sigma e^{-\theta t}\int_0^t e^{\theta s} \mathrm{d}W_s$$

Para obtener una solución numérica en Matlab con esto, necesitarás aproximar numéricamente (discretizar) el término integral usando un esquema de integración SDE como el de Euler-Maruyama descrito anteriormente:

th = 1;
mu = 1.2;
sig = 0.3;
dt = 1e-2;
t = 0:dt:2;             % Time vector
x0 = 0;                 % Set initial condition
rng(1);                 % Set random seed
W = zeros(1,length(t)); % Allocate integrated W vector
for i = 1:length(t)-1
    W(i+1) = W(i)+sqrt(dt)*exp(th*t(i))*randn; 
end
ex = exp(-th*t);
x = x0*ex+mu*(1-ex)+sig*ex.*W;
figure;
plot(t,x);

o sin for bucle utilizando cumsum :

th = 1;
mu = 1.2;
sig = 0.3;
dt = 1e-2;
t = 0:dt:2;             % Time vector
x0 = 0;                 % Set initial condition
rng(1);                 % Set random seed
ex = exp(-th*t);
x = x0*ex+mu*(1-ex)+sig*ex.*cumsum(exp(th*t).*[0 sqrt(dt)*randn(1,length(t)-1)]);
figure;
plot(t,x);

3. Solución analítica

Para calcular la solución analítica completa de un proceso de Ornstein-Uhlenbeck para una serie temporal dada y los correspondientes incrementos de Wiener, tendrá que utilizar un Proceso de Wiener "transformado en tiempo a escala" :

$$x_t = x_0 e^{-\theta t} +\mu (1-e^{-\theta t}) + \frac{\sigma e^{-\theta t}}{\sqrt{2 \theta}}W_{e^{2 \theta t}-1}$$

Ver Doob 1942 para más detalles y una derivación. El $W_{e^{2 \theta t}-1}$ puede parecer confuso, pero no es más que un proceso de Wiener con media y varianza cero $e^{2 \theta t}-1$ . Para calcular esto en Matlab:

th = 1;
mu = 1.2;
sig = 0.3;
dt = 1e-2;
t = 0:dt:2;             % Time vector
x0 = 0;                 % Set initial condition
rng(1);                 % Set random seed
W = zeros(1,length(t)); % Allocate integrated W vector
for i = 1:length(t)-1
    W(i+1) = W(i)+sqrt(exp(2*th*t(i+1))-exp(2*th*t(i)))*randn;
end
ex = exp(-th*t);
x = x0*ex+mu*(1-ex)+sig*ex.*W/sqrt(2*th);
figure;
plot(t,x);

Esto puede llevarse a cabo sin un for bucle utilizando cumsum y diff :

th = 1;
mu = 1.2;
sig = 0.3;
dt = 1e-2;
t = 0:dt:2;      % Time vector
x0 = 0;          % Set initial condition
rng(1);          % Set random seed
ex = exp(-th*t);
x = x0*ex+mu*(1-ex)+sig*ex.*cumsum([0 sqrt(diff(exp(2*th*t)-1)).*randn(1,length(t)-1)])/sqrt(2*th);
figure;
plot(t,x);

4. Recursos

También puede utilizar mi propio Caja de herramientas Matlab SDETools en GitHub para resolver numéricamente SDEs y calcular soluciones analíticas de procesos estocásticos comunes. En particular, véase el sde_ou para calcular las soluciones analíticas del proceso Ornstein-Uhlenbeck.

También recomiendo la lectura del siguiente excelente artículo para obtener más detalles sobre las SDE y su simulación en Matlab:

Desmond J. Higham, 2001, An Algorithmic Introduction to Numerical Simulation of Stochastic Differential Equations, SIAM Rev. (Secc. Educ.) , 43 525-46. http://dx.doi.org/10.1137/S0036144500378302

La URL de los archivos Matlab en el documento no funcionará - pueden ser se encuentra aquí ahora . Sin embargo, hay que tener en cuenta que parte de la sintaxis de Matlab (especialmente la relacionada con generación de números aleatorios y siembra ) está un poco desfasado, ya que se escribió hace casi 15 años.

0 votos

@student441: No estoy seguro de por qué querrías hacer eso. También creo que te refieres a $\mathrm{d}W_s$ no $ds$ . El integrante, $\frac{\sigma e^{\theta s}}{\sqrt{2 \theta}} \mathrm{d}W_s$ , ya es una solución integrada - usted estaría integrando esto de nuevo. Para hacerlo numéricamente, puedes mirar el número 2 de arriba (el for es más sencillo de adaptar). En este caso tienes incrementos de Wiener con $0$ media y varianza $e^{2 \theta t}-1$ (en lugar de $0$ media y varianza $t$ ). La función de difusión sólo difiere por un signo en el exponente. Ten cuidado si los términos exponenciales son muy grandes o pequeños.

0 votos

Estoy simulando su parte1 y estoy completamente de acuerdo en el procedimiento. Sin embargo, el trazado parece mostrar que el proceso tiene una varianza mucho mayor que el trazado en el artículo de la wikipedia, independientemente de la realización del proceso. ¿Podría explicar por qué? ¿Es posible que los parámetros indicados en el artículo de la wikipedia sean erróneos?

1 votos

@semola: Gracias por señalarlo. Lo he mirado y parece que no se está calculando bien el gráfico de la Wikipedia. La desviación estándar efectiva que se utiliza allí es $\sigma^2$ en lugar de sólo $\sigma$ . Esto puede verse examinando la sección de código fuente "R-Quelltext" para la imagen original . El código sigma*rnorm(n=1,mean=0,sd=sqrt(sigma^2*(to-from)/steps) debe ser sigma*sqrt((to-from)/steps)*rnorm(n=1,mean=0,sd=1) o rnorm(n=1,mean=0,sd=sqrt(sigma^2*(to-from)/steps) u otra forma equivalente.

5voto

Math-fun Puntos 4517

Debemos centrarnos en simular $\int_0^t e^{\theta (s)}\, \mathrm{d}W_s$ . Si $f(s)=e^{\theta (s)}$ es continuamente diferenciable, se puede utilizar el hecho de que $$\sum_{i=1}^{[tn]}f(s_i^*)\Big(W(s_i)-W(s_{i-1})\Big)\to\int_0^tf(s)dW(s)$$ en media cuadrática, para $s_i^* \in [s_{i-1},s_i]$ . Tenga en cuenta que debe utilizar $$W(s_i)-W(s_{i-1}) \sim N(0,s_i-s_{i-1})$$ y que estos incrementos son independientes.

0 votos

Gracias, pero ¿podría explicar algo más? ¿Entiendo correctamente que la ecuación que implementarías es: $ x_t = x_0 e^{-\theta t} + \mu(1-e^{-\theta t}) + \sigma \sum_{i=1}^{[tn]}f(s_i^*)\Big(W(s_i)-W(s_{i-1})\Big) e^{\theta (s)}\, $ ? ¿Puede explicar un poco más?

0 votos

De nada, la solución de horchler es bastante extensa.

0 votos

Hola, sé que esto fue hace mucho tiempo pero ¿podrías responder a la pregunta que hizo @estudiante441? Esencialmente, ¿estás proponiendo =0+(1)+[]=1()()(1))() ?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X