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.