%macro yahoo_stock_quotes (symbol=, start=, end=, prompt=NO, out=); %* Richard A. DeVenezia, 4/9/00 %* Quotes: A macro to retrieve historical daily stock quotes from Yahoo; %* %* symbol - ticker symbol %* start - starting date mm/dd/yy, default: 30 days prior to end %* end - ending date mm/dd/yy, default: today %* prompt - if YES then raise a macro window, otherwise proceed %* out - table name, default: same as symbol %* %* Yahoo url that delivers a CSV of daily stock quotes: %* https://query1.finance.yahoo.com/v7/finance/download %* /<SYMBOL> %* ?period1=<From-UnixEpochTimeStamp> %* &period2=<To-UnixEpochTimeStamp> %* &interval=1d %* &events=history %* %* 12/08/03 rad Thanks to Andrew Farrer for v.8 bugfix (%window) %* 4/20/07 rad Use IS8601DA to read date value %* 1/12/10 rad Thanks to Sunny in Atlanta for bug report {dash in symbol} %* Add out= option, compress symbol for default %* 4/01/20 rad Update to current URL and parameters %* 11/20/21 rad Update to includeAdjustedClose=true %*; %local symbol start end and; %local _s _e url period1 period2; %let and = %str(&); %if (%superq(symbol) eq ) %then %let symbol=msft; %let symbol = %upcase (&symbol); %if (%superq(end) eq ) %then %let end = %sysfunc(today(),mmddyy8); %if (%superq(start) eq ) %then %do; %let start = %sysfunc(inputn(&end,mmddyy8.)); %let start = %eval (&start-30); %let start = %sysfunc(putn(&start,mmddyy8.)); %end; %if (%upcase(&prompt) eq YES) %then %do; %window Quotes rows=12 columns=30 #2@2 "Symbol: " symbol 8 c=blue a=rev_video #4@2 "Start: " start 8 c=blue a=rev_video #6@2 "End: " end 8 c=blue a=rev_video ; %display Quotes; %let symbol = %upcase (&symbol); %end; %if (%superq(out) eq ) %then %let out = %sysfunc(compress(&symbol,%str(-./))); %let _e = %sysfunc(inputn(&end ,mmddyy10.)); %let _s = %sysfunc(inputn(&start,mmddyy10.)); %let period1 = %sysfunc(intck(SECOND, "01JAN1970:0:0"DT, %sysfunc(DHMS(&_s,0,0,0)))); %let period2 = %sysfunc(intck(SECOND, "01JAN1970:0:0"DT, %sysfunc(DHMS(&_e,0,0,0)))); %let url = https://query1.finance.yahoo.com/v7/finance/download/&symbol; %let url = &url.?period1=&period1.&and.period2=&period2.&and.interval=1d&and.events=history; %let url = &url.&and.includeAdjustedClose=true; filename quotes URL "&url"; data &out; infile quotes dlm=','; retain symbol "&symbol"; if _n_ = 1 then input; * skip header row; input Date is8601da. Open High Low Close AdjClose Volume; format Date mmddyy10.; format Volume comma11.; run; %if &SYSERR ne 0 and &SYSERR ne 4 %then %do; %put NOTE: --------------------; %put NOTE: SYSERR=&SYSERR.; %put NOTE: Check that you have used a valid stock symbol [&symbol]; %put NOTE: and a valid date range [&start] to [&end]; %put NOTE: --------------------; %end; %mend;
Sample code
/* %yahoo_stock_quotes (symbol=twx, prompt=YES) %yahoo_stock_quotes (symbol=msft, start=4/1/00, end=4/10/00) %yahoo_stock_quotes (symbol=msft, start=10/10/03, end=11/11/03) %yahoo_stock_quotes (symbol=tsla, start=04/01/19, end=04/01/20)
%macro hlc_plot (symbol=, start=, end=); %yahoo_stock_quotes (symbol=&symbol, start=&start, end=&end); %let myData = &syslast.; proc transpose data=&myData. out=&myData._hlc(rename=col1=Price); by symbol descending date ; var high low close; run; symbol1 i=HiLoC; goptions ftext='Arial'; proc gplot data=&myData._hlc; title "&symbol"; plot price * date; run; quit; %mend; %hlc_plot (symbol=HPT-PB, start=1/1/08); %hlc_plot (symbol=TCB-PA, start=1/1/08); %hlc_plot (symbol=MSFT, start=10/10/03, end=11/11/03); */