File Exchange Pick of the Week

Our best user submissions

Download Daily Stock Data from Yahoo! and Google

Sean's pick this week is Download Daily Data from Google and Yahoo! Finance by Michael Weidman.

Background

This submission contains a suite of tools for getting daily stock prices from Yahoo! and Google. There are utility functions for converting between Yahoo! and Google's formatting and to calculate adjusted closing prices, (which Yahoo! does automatically but which Google does not).

As a side note, Michael Weidman was one of the first few people I met when I started working at MathWorks. He taught me everything I know about the Kolmogorov-Smirnov test ( kstest() ) and was a frequent resource for all of us when it came to math questions (Thanks!). He left MathWorks a little over a year ago to pursue new ventures across the pond.

Acquiring Financial Data

For this simple example, we will use Michael's tools to pull financial data from Yahoo! and calculate an efficient frontier.

% Selected symbols
symbols = {'TSLA','MSFT','GOOG','MAR','SAM','PG','YHOO'};

% Retrieve data using Michael's function
data = getYahooDailyData(symbols,...
    '01/01/2011', '10/31/2013', 'dd/mm/yyyy'); %start, end, format

Data is a struct array of tables!

disp(data)
    TSLA: [730x7 table]
    MSFT: [730x7 table]
    GOOG: [730x7 table]
     MAR: [730x7 table]
     SAM: [730x7 table]
      PG: [730x7 table]
    YHOO: [730x7 table]

The table is a new MATLAB data container in R2013b. Tables make it easy to store heterogenous column data in one container. Michael has included a check to see if the instance of MATLAB is new enough to have tables, if it isn't, the code uses datasets, the table's predecessor from the Statistics Toolbox.

Let's take a look at a table by displaying the first 10 rows of Tesla's data:

disp(data.TSLA(1:10,:));
       Date       Open     High      Low     Close      Volume      AdjClose
    __________    _____    _____    _____    _____    __________    ________
    7.3451e+05    26.84       27     25.9    26.62     1.283e+06    26.62   
    7.3451e+05    26.66    26.95    26.02    26.67    1.1874e+06    26.67   
    7.3451e+05    26.48     26.9    26.19    26.83    1.4467e+06    26.83   
    7.3451e+05    26.83       28    26.81    27.88    2.0612e+06    27.88   
    7.3451e+05       28    28.58     27.9    28.24    2.2479e+06    28.24   
    7.3451e+05    28.17    28.68    28.05    28.45    1.3427e+06    28.45   
    7.3451e+05    28.59    28.71    26.92    26.96    1.7102e+06    26.96   
    7.3452e+05    27.01     27.4    26.52    26.96     9.644e+05    26.96   
    7.3452e+05    26.96    26.97    26.16    26.22     7.236e+05    26.22   
    7.3452e+05    26.15    26.58    25.61    25.75     1.192e+06    25.75   

We can see that the table is displaying the separate variables and their names. The best part is that we can still index it like a matrix using {}.

h = plot(data.TSLA{:,1},...   Date
         data.TSLA{:,2:5},... 2nd:5th variables are valuations
         'DisplayName',...    Variable names for the legend
         data.TSLA.Properties.VariableNames(2:5));

legend(h,'location','northwest'); %add legend
axis tight; % tight axes
datetick('x','mmmyy','keepticks','keeplimits'); %date tick
ylabel('Stock Price (US$)');

Now that we have the data we can use it to figure out how to get rich quickly by calculating the efficient frontier.

% Extract the closing valuations into an array:
assetsStruct = structfun(@(x)x.Close,data.','UniformOutput',false);
% Uses x.Close to extract the "Close" variable from each table.
assets = struct2array(assetsStruct); % Convert to array

% Convert to returns
assetReturns = tick2ret(assets);

% Create a portfolio object with the asset names. (Financial Toolbox req'd)
p = Portfolio('AssetList',symbols);

% Estimate the asset moments: Mean and Covariance, for the asset returns.
p = p.estimateAssetMoments(assetReturns);

% Set default constraints such that the weights sum up to one and to allow
% long only position (no shorting or shortselling: weights can't be negative)
p = p.setDefaultConstraints;

% Calculate frontier, risk and return
frontierWeights = p.estimateFrontier(20);
frontierRisk    = p.estimatePortRisk(frontierWeights);
frontierReturns = p.estimatePortReturn(frontierWeights);

% Visualize efficient frontier
figure;
plot(frontierRisk,frontierReturns, '*-r','LineWidth',2)
legend('Efficient Frontier','Location','SouthEast')
title('Efficient Frontier');
xlabel('Risk');
ylabel('Return');

The Rest of It

In addition to giving us easy to use tools to get data from Yahoo! and Google, Michael has also managed to use quite a few of the other features in the MATLAB language. These include: regular expressions, tables, the new functiontests capabilities for running function-based unit tests in the MATLAB unit testing framework, version checking, and safe-guarding against exceptions or errors. For example, when I first ran the above this morning before my laptop had found an internet connection:

Datafeed Toolbox

For additional options or access to many other popular Financial Data Servers such as Bloomberg® or Thomson Reuters®, MathWorks has the Datafeed Toolbox. This toolbox provides direct access to the servers through their APIs and allows for realtime as well as intraday tick information if requested.

Comments

Give it a try and let us know what you think here or leave a comment for Michael.




Published with MATLAB® R2013b

|
  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.