1 votos

¿Cómo obtener eficazmente las matrices de covarianza de una ventana móvil en Matlab?

Estoy tratando de producir una ventana móvil para estimar una matriz de covarianza utilizando un bucle for. Tengo mis rendimientos bajo la variable returns_sec y tengo 260 observaciones almacenadas en N_ret .

Ahora quiero producir una estimación de la matriz de covarianza basada en diez series de retorno a la vez y obtener una gran variable con todas las matrices de covarianza en ella (líneas superiores: Matrix1 , a continuación Matrix2 etc.).

Podría hacerlo a mano escribiendo:

kov_test=cov(returns_sec(1:10,:));  
kov_test2=cov(returns_sec(11:21,:));  ...

y copiar todos los resultados en una variable. Pero creo que también debería haber una forma más efectiva y fácil utilizando un bucle for.

¡Sería estupendo si alguno de vosotros pudiera ayudarme!

0 votos

Esto es casi puramente una pregunta de programación, podría ser más adecuado para Stack Overflow ... Además, ¿ya has intentado algo? Deberías haberlo hecho y deberías haber añadido tus intentos en la pregunta.

0 votos

@BobJansen: He intentado añadir la etiqueta de matlab pero el sistema no me deja, ¿tienes alguna explicación?

1 votos

Raro, he añadido la etiqueta sin problema. Si vuelve a pasar supongo que será un fallo del software de Stack Exchange. Edición: y luego no aparece. Haré un seguimiento de esto con Stack Exchange.

1voto

Le recomiendo que utilice la ventana superpuesta rodante (1ª implementación) en lugar de la no superpuesta (su ejemplo - 2ª implementación)

% overlapping rolling covariance
[n,m] = size(returns_sec); % n-> number of dates, m->number of assets
rolling_window = 10;
cov_test = nan(m*(n - rolling_window + 1),m);
for i = rolling_window:n
    start_index = m*(i - rolling_window) + 1; % aggregate covariance matrix start index
    end_index = m*(i - rolling_window +1); % aggregate covariance matrix end index
    covariance_mtx = cov(returns_sec(i-rolling_window +1:i,:));
    cov_test(start_index:end_index,:) = covariance_mtx;
end

% non-overlapping rolling covariance
[n,m] = size(returns_sec); % n-> numberg of dates, m->number of assets
rolling_window = 10;
num = floor(n/rolling_window); % number of non-overllaping intervals
cov_test = nan(m*num,m);
for i = 1:num
    start_index = m*(i - 1) + 1; % aggregate covariance matrix start index
    end_index = m*i; % aggregate covariance matrix end index
    covariance_mtx = cov(returns_sec(rolling_window*(i - 1) + 1: rolling_window*i,:));
    cov_test(start_index:end_index,:) = covariance_mtx;
end

0 votos

Si se me permite hacer una sugerencia más sobre el funcionamiento interno aquí, con $n$ la estimación de la matriz de covarianza sugerida anteriormente implica $n(n+1)/2$ parámetros libres y presumiblemente maneja la variación temporal de las correlaciones condicionales de forma ad hoc. Tiene la ventaja de la velocidad y la simplicidad, pero el OP podría pensar en modelar la dinámica de las correlaciones condicionales explícitamente. Hay un compromiso no tan obvio de resolver entre la varianza y el sesgo aquí.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X