我没有计量经济学工具箱,所以我不能给你详细的代码(大多数 Matlab 安装默认没有这个工具箱)。但是,您的情况很常见,因此我认为做您需要的事情应该不会太难。您可以考虑使用 The MathWorks创建服务请求或在Quant.StackExchange上发布问题。确保您清楚自己感兴趣的 SDE。抱歉,我无法在该领域为您提供更多帮助。
模拟这组耦合 SDE 的另一种方法是使用我自己的SDETools工具箱,该工具箱可在 GitHub 上免费获得。如果您对 Matlab 的 ODE 套件函数(例如ode45
. SDETools 还具有使用其解析解的常见随机过程(例如几何布朗运动和 Ornstein-Uhlenbeck)的专用函数。这是使用 SDETools 中的 Euler-Maryama 积分器函数模拟 SDE 的具有任意参数值的基本代码sde_euler
:
t0 = 0;
dt = 1e-2;
tf = 1e1;
tspan = t0:dt:tf; % Time vector
y0 = [1;1]; % Initial conditions
kappa = 10;
mu = 0;
tau = 1e-1;
sigma = 1e-2;
f = @(t,y)[kappa.*(mu-y(1));y(1).*y(2)]; % Drift
g = @(t,y)[tau;sigma.*y(2)]; % Diffusion
% Set random seed and type of stochastic integration
options = sdeset('RandSeed',1,'SDEType','Ito');
Y = sde_euler(f,g,tspan,y0,options); % Euler-Maruyama
figure;
plot(tspan,Y)
事实上,sde
Econometrics 工具箱中的函数本身有可能采用两个函数句柄,f
并且g
,我在上面创建。
这是您可以模拟系统的另一种方法(它可能更快,也可能不会更快),这次使用该sde_ou
函数首先生成一个 OU 进程,该进程本身独立于其他方程:
...
options = sdeset('RandSeed',1);
Y(:,1) = sde_ou(kappa,mu,tau,tspan,y0(1),options); % OU process
f = @(t,y)Y(round(t/dt)+1,1).*y; % Index into OU process as a function of t
g = @(t,y)sigma.*y;
options = sdeset('RandSeed',2,'SDEType','Ito');
Y(:,2) = sde_euler(f,g,tspan,y0(2),options); % Euler-Maruyama of just second equation
figure;
plot(tspan,Y)
请注意,即使在 OU 过程中使用相同的随机种子,由于 Wiener 增量在内部生成的顺序,Y(:,1)
对于这种情况和情况的输出也会略有不同。sde_euler
同样,您也可以使用计量经济学工具箱中的函数做类似的事情。