У меня нет инструментария эконометрики, поэтому я не могу дать вам подробный код (большинство установок Matlab не имеют этого инструментария по умолчанию). Однако ваш случай довольно распространен, поэтому я полагаю, что не должно быть слишком сложно делать то, что вам нужно. Вы можете рассмотреть creating a service request с The MathWorks или разместить вопрос по адресу Quant.StackExchange. Удостоверьтесь, что вы ясно знаете, какие SDE вам интересны. Извините, что я не могу помочь вам больше в этой области.
Другой способ моделирования этого связанного набора SDE - использовать мой собственный набор инструментов SDETools, который можно бесплатно загрузить на GitHub. Это довольно просто, если у вас есть опыт работы с функциями ODE Suite от Matlab, например ode45
. SDETools также имеет специальные функции для общего стохастического процесса (например, геометрическое броуновское движение и Ornstein-Uhlenbeck), используя их аналитические решения. Вот основной код с произвольными значениями параметров для имитации вашего СДУ с помощью функции интегратора Эйлера-Maryama, sde_euler
в SDETools:
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
функции в панели инструментов эконометрики может сам взять два функции, 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 используется только одно и то же случайное семя, выход Y(:,1)
будет немного отличаться для этого и случай sde_euler
из-за порядка, в котором пороги Винера генерируются внутри. Опять же, вы можете сделать что-то подобное, используя функцию в панели инструментов Econometrics.
Это похоже на математический вопрос, чем на программирование, нет? Ваш 'Y (t)' SDE выглядит не что иное, как [геометрическое броуновское движение] (http://en.wikipedia.org/wiki/Geometric_Brownian_motion) с изменяющимся во времени дрейфом 'G (t)'. В этом случае набор инструментов Econometrics имеет специальные функции для обычных стохастических процессов, таких как ([gbm'] (http://www.mathworks.com/help/econ/gbm.html)). Они проще в использовании и, вероятно, намного быстрее имитируются. – horchler
Для полной ясности значение G (t) не должно было быть равно 0,3 * X. Я просто положил это на пример простой SDE. Каким будет код для определения G (t) и Y (t) для Y (t), как определено выше, и 'dG (t) = kappa * (mu - G (t)) dt + tau dW (t) , Заметим, что процессы Вайнера для двух уравнений здесь раздельны. Спасибо за вашу помощь! – pagarwal
Ну, ваш 'dG (t)' выглядит как [процесс Орнштейна-Уленбека] (http://en.wikipedia.org/wiki/Ornstein-Uhlenbeck_process). Опять же, панель инструментов Econometrics имеет специальную функцию для этого процесса: ['hmv'] (http://www.mathworks.com/help/econ/hwv.html). – horchler