Download Historical Stock Quotes from Yahoo to Excel
Note: In May 2017, the "tables" and "ichart" API from Yahoo to download historical stock data was discontinued by the Yahoo Finance team. The following illustrates the new method of using the “query1” API to download historical stock data. A “cookie” and a “crumb” is required to call this new API successfully. The VBA programming codes for extracting these two components is shown below.
This document will show you how to automate the download of the Stock Quotes from Yahoo Finance (https://finance.yahoo.com) to Excel. We will be using a simple programming language called Visual Basic for Applications (VBA) and will be going through the steps, one at a time to allow you to construct the model without prior knowledge of VBA. The completed model is also available for download below.
1. Launch Excel and create a new workbook. Call this workbook AutomatedDownloadData.xlsm.
In Microsoft Excel 2003: Go to Tools->Macro->Visual Basic Editor
In Microsoft Excel 2007/2010/2013/2016: Go to Developer->Visual Basic
2. Right click on VBAProject (your Excel Filename) and select Insert->Module. A default Module1 will be inserted. Click on Module1 and paste the VBA code below on the right hand side of the Visual Basic Editor. The following VBA code allows you to download data from Yahoo Finance using a specified Stock symbol, Start Date and End Date.
Sub GetStock(ByVal stockSymbol As String, ByVal StartDate As Date, ByVal EndDate As Date) Dim crumb As String Dim cookie As String Dim response As String Dim strUrl As String Dim DownloadURL As String Dim period1, period2 As String Dim httpReq As WinHttp.WinHttpRequest Set httpReq = New WinHttp.WinHttpRequest Application.ScreenUpdating = False DownloadURL="https://finance.yahoo.com/lookup?s=" & stockSymbol With httpReq .Open "GET", DownloadURL, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" .send .waitForResponse response = .responseText cookie = Split(.getResponseHeader("Set-Cookie"), ";")(0) End With period1 = (StartDate - DateValue("January 1, 1970")) * 86400 period2 = (EndDate - DateValue("January 1, 1970")) * 86400 Dim counter As Long Dim startCounter As Long Dim result As String crumb = Chr(34) & "CrumbStore" & Chr(34) & ":{" & Chr(34) & "crumb" & Chr(34) & ":" & Chr(34) startCounter = InStr(response, crumb) + Len(crumb) While Mid(response, startCounter, 1) <> Chr(34) result = result & Mid(response, startCounter, 1) startCounter = startCounter + 1 Wend crumb = result DownloadURL="https://query1.finance.yahoo.com/v7/finance/download/" &stockSymbol & "?period1=" & period1 & "&period2=" &period2 & "&interval=1d&events=history&crumb=" & crumb With httpReq .Open "GET", DownloadURL, False .setRequestHeader "Cookie", cookie .send .waitForResponse dataResult = .responseText End With dataResult = Replace(dataResult, ",", vbTab) Dim dataObj As New DataObject dataObj.SetText dataResult dataObj.PutInClipboard Set currentWorksheet = ThisWorkbook.ActiveSheet Set currentRange = currentWorksheet.Range("A1") dataObj.GetFromClipboard currentRange.PasteSpecial ActiveWindow.SmallScroll Down:=-12 Columns("A:A").TextToColumns Destination:=Range("A1"), _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote,ConsecutiveDelimiter:=False,_ Tab:=True, _ Semicolon:=False, Comma:=True, Space:=False, _ Other:=False, FieldInfo _ :=Array(Array(1, 1),Array(2, 1),Array(3, 1),Array(4, 1),_ Array(5, 1), Array(6, 1), Array(7, 1)) Columns("A:F").EntireColumn.AutoFit Range("A1").Select Application.ScreenUpdating = True End Sub Sub Download() Call GetStock("BAC", "01/01/2017", "06/21/2017") End Sub
3. Next, in the Microsoft Visual Basic for Applications editor, click on the Tools->Reference menu item and ensure that “Microsoft WinHTTPServices” and “Microsoft Forms 2.0 Object Library” are included. If you do not see ”Microsoft.WinHTTPServices”, you can click on the “Browse” button and then navigate to the “C:\Windows\System32\” folder to add “winhttpcom.dll”.
4. Click on Save and then File->Close to return to Microsoft Excel. In Excel, try out the downloading of data by going to
Excel 2003:
Go to Tools->Macro->Macros…, select the Download macro and click run
Excel 2007/2010/2013:
Go to Developer->Macros, select the Download macro and click run.
This will initiate a download of Stock Prices from Yahoo! Finance.
What we have written is a subroutine that downloads stock data automatically and can be executed by Excel. It takes "stockSymbol", "StartDate" and "EndDate" as parameters.
In the whole block of code above, the most important part is the following.
DownloadURL = "https://query1.finance.yahoo.com/v7/finance/download/" & stockSymbol & "?period1=" & period1 & "&period2=" & period2 & "&interval=1d&events=history&crumb=" & crumb With httpReq .Open "GET", DownloadURL, False .setRequestHeader "Cookie", cookie .send .waitForResponse dataResult = .responseText End With
It basically says that we will be downloading data from DownloadURL:
https://query1.finance.yahoo.com/v7/finance/download/" & stockSymbol & "?period1=" & period1 & "&period2=" & period2 & "&interval=1d&events=history&crumb=" & crumb
- stockSymbol is the variable containing a stock symbol such as “BAC”.
- period1 and period2 specifies the start date and end date to download data.
- The “cookie” and “crumb” (extracted from response) required is extracted with the following VBA codes.
DownloadURL="https://finance.yahoo.com/lookup?s="&stockSymbol With httpReq .Open "GET", DownloadURL, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" .send .waitForResponse response = .responseText cookie = Split(.getResponseHeader("Set-Cookie"), ";")(0) End With
You can also find the implementation of this example in the workbook DownloadStockQuotes.xlsm.
Download
Free spreadsheet to download Stock Quotes - v1.1
System Requirements
Microsoft® Windows 7, Windows 8 or Windows 10
512 MB RAM
5 MB of Hard Disk space
Excel 2007, 2010, 2013, 2016
License
By downloading this software from our web site, you agree to the terms of our license agreement.
Download
DownloadStockQuotes.zip (Zip Format - 423 KB)