For loop with moving window

3 visualizaciones (últimos 30 días)
civs
civs el 30 de Jul. de 2014
Respondida: Alejandra Pena-Ordieres el 29 de Jul. de 2024
Hi
I want to create a for-loop that calculates the weights of portfolios using a moving window for the period I am investigating. The moving window should move one day at a time and there are 1000 days in the window.
For example, compute the optimal weights on day1001 based on observations for period 1-1000days. Then you move on to day 1002, and re-calculate the weights, based on observations for period 2-1001days, etc.
I have a matrix of returns (Rets) that is 3740x6. The first column has the dates and the rest of the columns have daily returns for five different asset classes.
Thanks!

Respuestas (4)

Image Analyst
Image Analyst el 31 de Jul. de 2014
Simply use conv()
kernel = [zeros(1,999), ones(1,1000)]; % Look backward 1000 elements.
output = conv(observations, kernel, 'valid'); % Get sliding means
  5 comentarios
Evan
Evan el 31 de Jul. de 2014
Editada: Evan el 31 de Jul. de 2014
Googling "convolution" may help you to get an overall idea of the operation before getting into the MATLAB implementation of it. You might find the wikipedia entry helpful, although I often find that I drown in notation when trying to read through mathematics wiki articles.
Basically, conv() will slide the kernel over the vector, progressing one element at a time, and multiply then sum corresponding values that fall within the window. It "pads" the array with zeros in order to start with the first element. Here's an example:
A = [1 2 3 4 5];
B = [1 1];
conv(A,B)
ans =
1 3 5 7 9 5
So here's the progression:
[ 0 1 2 3 4 5 0]
[ 1 1 ]
1*0 + 1*1 = 1;
__________________
[ 0 1 2 3 4 5 0 ]
[ 1 1 ]
1*1 + 1*2 = 3
__________________
[ 0 1 2 3 4 5 0 ]
[ 1 1 ]
1*2 + 1*3 = 5
__________________
[ 0 1 2 3 4 5 0]
[ 1 1 ]
1*3 + 1*4 = 7
__________________
[ 0 1 2 3 4 5 0]
[ 1 1 ]
1*4 + 1*5 = 9
__________________
[ 0 1 2 3 4 5 0]
[ 1 1 ]
1*5 + 1*0 = 5
Image Analyst
Image Analyst el 31 de Jul. de 2014
Editada: Image Analyst el 31 de Jul. de 2014
Convolution basically gives you a weighted sum in a sliding window. It would give you the average value (price?) of your signal over the past 1000 days. I'm a scientist, not a financial person, so perhaps you don't want that - I don't know. If you do want a weighted sum in a sliding window (like the 20 day or 50 day moving stock price average) then convolution is for you, though there may be some functions in the Financial Toolbox that are better suited, like with more options and using the terminology financial people are familiar with.
There is also a conv2() function that deals with 2D arrays. If you just wanted to sum up going down columns, then the kernel would be a column vector. If you wanted to average across columns, then the kernel would be a row vector.

Iniciar sesión para comentar.


Ahmet Cecen
Ahmet Cecen el 30 de Jul. de 2014
Editada: Ahmet Cecen el 30 de Jul. de 2014
If I understand you correctly, you have an indexing problem. Try an indexing scheme like this:
for i=1:N
Weights(i)=function(Rets(i:(i+1000),2));
end
  20 comentarios
civs
civs el 5 de Ag. de 2014
To store all the results from the loop (weights)... I tried changing this to portfolio returns and it doesn't work. Can I just store it in a vector?
civs
civs el 5 de Ag. de 2014
When I store the weights instead of the portfolio returns this is the error I get:
In an assignment A(I) = B, the number of elements in B and I must be the same.
Error in Backtesting (line 37) port_glo_min_var(i)= Rets(i-1000:i-1,:) * wmin_var{i-1000};

Iniciar sesión para comentar.


Arijit Ghosh
Arijit Ghosh el 9 de Mzo. de 2017
Hello I need to design a sliding window of time t=5 sec. to slide all over the signal without overlap and thereby perform CWT from each window. Can anyone help please..

Alejandra Pena-Ordieres
Alejandra Pena-Ordieres el 29 de Jul. de 2024
Hello,
You might want to consider using the backtesting workflow available in the Financial Toolbox, Backtest Investment Strategies Using Financial Toolbox. In your case, you'd need to convert your data into a timetable and define your optimization strategy as a backtestStrategy with RebalanceFrequency=1 and a LookbackWindow = [1000 1000].

Categorías

Más información sobre Portfolio Optimization and Asset Allocation en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by