clear all close all clc set(0,'defaulttextfontsize',12); set(0,'defaultaxesfontsize',12); set(0,'defaultlinelinewidth',2); set(0,'defaultlinemarkersize',12); tickers={'^vix','^vxn','^vxd','^rvx','^gvz','^vxtlt','^VVIX'}; title_mtx={'SPY','QQQ','DOW','RUS','GLD','TLT','VIX'}; %% %%% Read historical data from Yahoo Finance clear Y Y0 figure(length(findobj('type','figure'))+1) for i0=1:length(tickers) try Y0=getMarketDataViaYahoo(char(tickers(i0)),'23-Jan-2001',datetime('today'),'1d'); Y(i0).Date = datenum(Y0{:, 1}); Y(i0).Open = table2array(Y0(:, 2)); Y(i0).High = table2array(Y0(:, 3)); Y(i0).Low = table2array(Y0(:, 4)); Y(i0).Close = table2array(Y0(:, 5)); Y(i0).AdjClose = table2array(Y0(:, 6)); Y(i0).Volume = table2array(Y0(:, 7)); Y(i0).Ticker = char(tickers(i0)); percentile_rank=percentile_rank_calculator(Y(i0).Close); subplot(4,2,i0) plot(100*percentile_rank) if i0==1 || i0==3 || i0==5 || i0==7 ylabel('Rank [%]') end title([char(title_mtx(i0)) ': ' num2str(100*percentile_rank(end),3)]) catch subplot(4,2,i0) plot(nan*1) text(0.1,0.5,'data not available') title(char(title_mtx(i0))) continue end end %%% Functions are defined below %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function percentile_rank=percentile_rank_calculator(X) X_steps=linspace(min(X),max(X),1000)'; percentaile_rank=[]; for i0=1:length(X_steps) counter=0; for i1=1:length(X) if X(i1)<=X_steps(i0) counter=counter+1; end end percentaile_rank=[percentaile_rank; counter/length(X)]; end X_rank=interp1(X_steps,percentaile_rank,X); percentile_rank=X_rank; end function data = getMarketDataViaYahoo(symbol, startdate, enddate, interval) % Downloads market data from Yahoo Finance for a specified symbol and % time range. % % INPUT: % symbol - is a ticker symbol i.e. 'AMD', 'BTC-USD' % startdate - the date from which the market data will be requested % enddate - the market data will be requested till this date % interval - the market data will be returned in this intervals % supported intervals are '1d', '5d', '1wk', '1mo', '3mo' % % OUTPUT: % data - is a retrieved dataset returned as a table % % Example: % data = getMarketDataViaYahoo('AMD', '1-Jan-2018', datetime('today'), '5d'); % % Author: Artem Lenskiy, PhD % Version: 1.13 % % Special thanks to Patryk Dwórznik (https://github.com/dworznik) for % a hint on JavaScript processing. % % Alternative approach is given here % https://stackoverflow.com/questions/50813539/user-agent-cookie-workaround-to-web-scraping-in-matlab % % Another approach taken form WFAToolbox is to send a post request as % follows: % urlread(url, 'post',{'matlabstockdata@yahoo.com', 'historical stocks'}) if(nargin() == 1) startdate = posixtime(datetime('1-Jan-2018')); enddate = posixtime(datetime()); % now interval = '1d'; elseif (nargin() == 2) startdate = posixtime(datetime(startdate)); enddate = posixtime(datetime()); % now interval = '1d'; elseif (nargin() == 3) startdate = posixtime(datetime(startdate)); enddate = posixtime(datetime(enddate)); interval = '1d'; elseif(nargin() == 4) startdate = posixtime(datetime(startdate)); enddate = posixtime(datetime(enddate)); else error('At least one parameter is required. Specify ticker symbol.'); data = []; return; end %% Send a request for data % Construct an URL for the specific data uri = matlab.net.URI(['https://query1.finance.yahoo.com/v7/finance/download/', upper(symbol)],... 'period1', num2str(int64(startdate), '%.10g'),... 'period2', num2str(int64(enddate), '%.10g'),... 'interval', interval,... 'events', 'history',... 'frequency', interval,... 'guccounter', 1,... 'includeAdjustedClose', 'true'); options = weboptions('ContentType','table', 'UserAgent', 'Mozilla/5.0'); try data = rmmissing(webread(uri.EncodedURI, options)); catch ME data = []; warning(['Identifier: ', ME.identifier, 'Message: ', ME.message]) end end