MATLAB: Time series plot from structure array

arrayplotstructurestime series

Hello everyone,
I have a stock prices data from Yahoo Finance that I collected and placed in a structure array in the following manner:
clc
load('SP500stocks.mat'); %load data from a previously saved workspace
fields ={'Open', 'High', 'Low', 'Close', 'Volume'}; %create a variable fields
stocks_adj_close = rmfield(stocks, fields); % removes the fields mentionned here above
struct2csv(stocks_adj_close, 'SP500 Adjusted Stocks Prices (2000-20019).csv');
The result is:
stocks_adj_close =
1×503 struct array with fields:
Date
AdjClose
Ticker
The field "ticker" stores the ticker names of each SP500 companies and the period is from Jan-2000 to Jul-2019.
I would like to plot the stock prices of several comapnies in the same graph for a chosen period of my choice, say for instance AAPL, AIG, etc
How can I do that?

Best Answer

but for the original data set tickers will have different number of dates so it will not be possible to put them in a table (I think?)
Not a problem, as long as there's good overlap between the date. If they're completely distinct then it may be a waste of time.
Using your demo test file:
%assuming that you have a structure stocks in the workspace
numdateperticker = arrayfun(@(s) numel(s.Date), stocks);
tickers = table(datetime(vertcat(stocks.Date)), vertcat(stocks.AdjClose), repelem({stocks.Ticker}', numdateperticker), ...
'VariableNames', {'Date', 'AdjClose', 'Ticker'});
tickers = table2timetable(unstack(tickers, 'AdjClose', 'Ticker'))
Tickers for which there's no value for a date will get a NaN for that particular date.
Now to plot this for a given time range:
range = timerange('01-Jan-2016', '10-Apr-2018'); %whatever you want it to be
selectedtickers = {'AAPL', 'FB'};
tickersrange = tickers(range, :);
plot(tickersrange.Properties.RowTimes, tickersrange{:, selectedtickers});
legend(selectedtickers);
Or using stacked plots, even simpler:
range = timerange('01-Jan-2016', '10-Apr-2018');
selectedtickers = {'AAPL', 'FB'};
stackedplot(tickers(range, selectedtickers));