Code covered by the BSD License  

Highlights from
Google Finance Historical Stock Data Downloader

from Google Finance Historical Stock Data Downloader by Alejandro Arrizabalaga
gathers historical stock information from Google Finance.

get_gf_histdata(stock,varargin)
% function [stock_data] = get_gf_histdata(stock,varargin)
%
% Description: This function gets the historical data of a stock from the
% Google Finance nice website.
%
% Usage:   [stock_data] = get_gf_histdata(stock,varargin);
%           stock       = string containing the market and the stock symbol together:
%                         For example:'NASDAQ:GOOG' or 'NYSE:GE'.
%           varargin    = 'start', startdate with format 29-Sep-2009 or 29/Sep/2009 (dafault is 1 year ago)
%                       = 'end', enddate of format 29-Sep-2009 or 29/Sep/2009(default is today)
%                       = 'weekly'/'daily' (default='daily')
%                       = 'format', 'standard', 'ts', 'hist_stock_data',
%                         use standard format, financial time series format or as in hist_stock_data from Josiah Renfree.
%
% History:  29-Sep-09: Created by Alejandro Arrizabalaga (Matlab 2008 version)

function [stock_data] = get_gf_histdata(stock,varargin)

%% Defaults
period='daily';
hist_stock_data=0;
fts=0;
enddate=[datestr(today,3) '+' datestr(today,7) '%2C+' datestr(today,10)];
startdate=[datestr(today,3) '+' datestr(today,7) '%2C+' num2str(str2num(datestr(today,10))-1)];

%% Process arguments
if nargin < 1
    error('No stock symbol provided, please provide one');
else
    if ~isstr(stock)
            error('No valid stock symbol provided, please provide one (string)');
    end
end

iarg = 0;
while (iarg<nargin-1)
    iarg = iarg +1;
    arg  = varargin{iarg};
    if isstr(arg)
        switch arg
            case 'daily'
                period='daily'
            case 'weekly'
                period='weekly'
            case 'start'
                iarg = iarg + 1;
                if(iarg>nargin-1)
                    error('no start date supplied');
                else
                    ipar = varargin{iarg};
                    if (isstr(ipar))
                        startstr=strrep(ipar,'/','-');
                        startdate=[startstr(1:2) '+' startstr(4:6) ',+' startstr(8:11)];
                    else
                        error('no valid start date supplied (use a string)');
                    end;
                end;
            case 'end'
                iarg = iarg + 1;
                if(iarg>nargin-1)
                    error('no end date supplied');
                else
                    ipar = varargin{iarg};
                    if (isstr(ipar))
                        endstr=strrep(ipar,'/','-');
                        enddate=[startstr(1:2) '+' startstr(4:6) ',+' startstr(8:11)];
                    else
                        error('no valid end date supplied (use a string)');
                    end;
                end;
            case 'format'
                iarg = iarg + 1;
                if(iarg>nargin-1)
                    error('no format supplied');
                else
                    ipar = varargin{iarg};
                    if (isstr(ipar))
                        if strcmp(ipar,'ts')
                            fts=1;
                        elseif strcmp(ipar,'hist_stock_data')
                            hist_stock_data=1;  
                        elseif strcmp(ipar,'standard')
                        else
                                                    error('no valid format supplied (use a string)');
                        end
                    else
                        error('no valid format supplied (use a string)');
                    end;
                end;
            otherwise
                error('no valid argument supplied. Type ''help get_gf_histdata'' for info.');
        end
    end
end

%% Get stock historical data

%make URL
url=['http://www.google.com/finance/historical?q=' stock '&histperiod' period '&startdate=' startdate '&enddate' enddate '&output=csv']; 

%get data
[gfdata, gfstatus] = urlread(url);

if gfstatus
    % organize data by using the comma delimiter
    scandata = textscan(gfdata(34:end),'%s%s%s%s%s%s','delimiter',',');

    stock_data.date = scandata{1};
    stock_data.open = str2double(scandata{2});
    stock_data.high =  str2double(scandata{3});
    stock_data.low =  str2double(scandata{4});
    stock_data.close = str2double(scandata{5});
    stock_data.volume =  str2double(scandata{6});
   
    if hist_stock_data
        stock_data_old=stock_data;
        clear stock_data;
        for idx=1:length(stock_data_old.date)
            stock_data(idx).Ticker = stock;
            stock_data(idx).Open = stock_data_old.date(idx);
            stock_data(idx).High = stock_data_old.high(idx);
            stock_data(idx).Low = stock_data_old.low(idx);
            stock_data(idx).Close = stock_data_old.close(idx);
            stock_data(idx).Volume = stock_data_old.volume(idx);
        end
    elseif fts
        stock_data=fints(datenum(stock_data.date),[stock_data.open stock_data.high stock_data.low stock_data.close stock_data.volume],{'OPEN' 'HIGH' 'LOW' 'CLOSE' 'VOLUME'},period);    
     end
else
    error('Unable to retrieve data from Google Finance');
end

Contact us at files@mathworks.com