【MATLAB】股票(和指数)数据下载--雅虎财经
文章目录
- 一、构建请求
- 二、响应解读及整理
- 2.1 响应
- 2.2 数据提取和保存
- 三、通用函数
- 3.1 函数
- 3.2 调用示例
- 四、雅虎财经股票、指数代码
- 4.1 指数
- 4.2 股票
- 五、GUI界面、可执行程序
雅虎2021年就退出中国了,你懂的。
能下载股票等数据的财经网站、软件也很多。我写着玩的。
一、构建请求
去雅虎财经网站,随便选择一个指数,或者搜索一个股票,点击历史数据,即可看到历史数据:
然后打开浏览器检查,网络选项,清除之前的请求,重新选择感兴趣的日期后加载,即可看到数据请求的api,右键复制curl(bash)格式。
然后生成对应语言的网络请求即可:https://curlconverter.com/
比如本文的matlab。
当然你也可以自己根据标头、载荷手动构建请求。
以标普500指数为例:
❄️载荷 payload:
period1
和period2
是开始时间和结束时间的时间戳:1970年开始到你选择的日期的秒数。1672012800就是2023年12月26日 16:10:00 UTC。
symbol
:指数(或股票)的代号,^GSPC
是雅虎财经的代号;标普500指数代号是S&P 500,不同平台可能不同。
interval
:间隔,可选择的是:1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
(一年约252个交易日)
并不是所有参数都需要使用的,比如地区、语言应该是不用设置的,这里只是解释一下完整的http请求。
params = {
'events' 'capitalGain|div|split'
'formatted' 'true'
'includeAdjustedClose' 'true'
'interval' '1d'
'period1' '1672012800'
'period2' '1735222812'
'symbol' '^GSPC'
'userYfid' 'true'
'lang' 'zh-Hant-HK'
'region' 'HK'
};
❄️cookie:这个不用也行的,反正不用登录就能看。
cookies = {
'GUC' 'xxx'
'A1' 'xxx'
'A3' 'xxx'
'A1S' 'xxx'
'PRF' 'xxx'
'cmp' 'xxx'
'gpp' 'xxx'
'gpp_sid' '8'
'axids' 'xxx'
};
❄️请求地址uri:
可以看到,这个基本请求地址是包含股票代号的:%5EGSPC
(%5E即^),所以不是通用的,后面会根据股票代号构建。
第二行代码就是把params的各个参数连接起来,形成一个完整的uri。
baseURI = 'https://query1.finance.yahoo.com/v8/finance/chart/%5EGSPC';
uri = [baseURI '?' char(join(join(params, '='), '&'))];
由 weboptions 对象 options 指定其他 HTTP 请求选项:
用于在 MATLAB 中发送 HTTP 请求时,模拟来自浏览器的请求行为。特别是:设置了详细的请求头(包括 cookies、用户代理、语言等),确保请求看起来像是来自真实用户。
options = weboptions(...
'UserAgent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',...
'HeaderFields', {
'accept' '*/*'
'accept-language' 'zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7'
'cookie' char(join(join(cookies, '='), '; '))
'origin' 'https://hk.finance.yahoo.com'
'priority' 'u=1, i'
'referer' 'https://hk.finance.yahoo.com/quote/%5EGSPC/history/?period1=1672012800&period2=1735222812'
'sec-ch-ua' '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
'sec-ch-ua-mobile' '?0'
'sec-ch-ua-platform' '"Windows"'
'sec-fetch-dest' 'empty'
'sec-fetch-mode' 'cors'
'sec-fetch-site' 'same-site'
}...
);
读取响应:
response = webread(uri, options);
上面只是curlconverter
生成的完整代码,有些参数不是必须的,且matlab还可以使用HTTP Interface
创建网络请求。
二、响应解读及整理
2.1 响应
结果在response
中,这是讲的是webread
函数返回的结果。
response
是一个结构体,非常好解析,通常最后的元素就是数组或者table。
直接到:response.chart.result
,这里就是我们需要的查询数据。
meta
:是一些元信息,比如股票代号,币种等等。
timestamp
:是时间戳,和具体股票数据一一对应的。时间上是递增的。
indicators
:是指标,即价格等数据。
打开indicators :
quote
包含开盘价等数据,adjclose
是调整后的收盘价。
调整后的收盘价(Adjusted Closing Price)是股票或指数的收盘价经过股息、股票分割、配股等因素调整后的价格。
quote: 成交量、开盘价、最低价、收盘价、最高价
2.2 数据提取和保存
保存到table
里面。
%% 创建table
short_struct = response.chart.result;
% 大小
sz = [length(short_struct.indicators.quote.open) 7];
% 列名
varNames = {'日期','开盘','最高','最低','收盘','调整后的收盘价','成交量'};
% 数据类型
varTypes = {'datetime','double','double','double','double','double','uint64'};
T = table('Size',sz,'VariableTypes',varTypes,'VariableNames',varNames);
%% 填充table
% 将时间戳转为可读的时间
t = datetime(short_struct.timestamp, 'ConvertFrom', 'posixtime', 'Format', 'yyyy-MM-dd');
T.("日期") = t;
T.("开盘") = short_struct.indicators.quote.open;
T.("最高") = short_struct.indicators.quote.high;
T.("最低") = short_struct.indicators.quote.low;
T.("收盘") = short_struct.indicators.quote.close;
T.("调整后的收盘价") = short_struct.indicators.adjclose.adjclose;
T.("成交量") = short_struct.indicators.quote.volume;
%% 导出到excel
writetable(T,'标普500指数221226_241226.xlsx');
三、通用函数
3.1 函数
function resp = fetch_and_save_stock_data(symbol, start_date, end_date, filename)
% fetch_and_save_stock_data 获取股票数据并保存为Excel文件
% 输入:
% symbol - 股票代号(如:'AAPL', '^GSPC')
% start_date - 开始日期(如:'2024-01-01')
% end_date - 结束日期(如:'2024-12-31')
% filename - 保存的Excel文件名(如:'stock_data.xlsx')
% 将输入的日期转换为Unix时间戳(秒)
start_timestamp = posixtime(datetime(start_date, 'InputFormat', 'yyyy-MM-dd'));
end_timestamp = posixtime(datetime(end_date, 'InputFormat', 'yyyy-MM-dd'));
% 设置Yahoo Finance请求参数
params = {
'events' 'capitalGain|div|split'
'formatted' 'true'
'includeAdjustedClose', 'true'
'interval' '1d'
'period1' num2str(start_timestamp)
'period2' num2str(end_timestamp)
'symbol' symbol
'userYfid' 'true'
'lang' 'zh-Hant-HK'
'region' 'HK'
};
encoded_symbol = urlencode(symbol);
baseURI = ['https://query1.finance.yahoo.com/v8/finance/chart/', encoded_symbol];
disp(baseURI)
uri = [baseURI '?' char(join(join(params, '='), '&'))];
% 动态生成 referer URL
referer_url = ['https://hk.finance.yahoo.com/quote/', encoded_symbol, '/history/?period1=', num2str(start_timestamp), '&period2=', num2str(end_timestamp)];
options = weboptions(...
'UserAgent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',...
'HeaderFields', {
'accept' '*/*'
'accept-language' 'zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7'
'origin' 'https://hk.finance.yahoo.com'
'priority' 'u=1, i'
% 'referer' 'https://hk.finance.yahoo.com/quote/NVDA/history/?period1=1672012800&period2=1735228800'
'referer' referer_url
'sec-ch-ua' '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
'sec-ch-ua-mobile' '?0'
'sec-ch-ua-platform' '"Windows"'
'sec-fetch-dest' 'empty'
'sec-fetch-mode' 'cors'
'sec-fetch-site' 'same-site' ...
}...
);
% 从Yahoo Finance读取数据
response = webread(uri, options);
% 解析返回的数据
short_struct = response.chart.result;
% 创建表格
sz = [length(short_struct.indicators.quote.open), 6];
varNames = {'日期', '开盘', '最高', '最低', '收盘', '成交量'};
varTypes = {'datetime', 'double', 'double', 'double', 'double', 'uint64'};
T = table('Size', sz, 'VariableTypes', varTypes, 'VariableNames', varNames);
% 填充表格数据
t = datetime(short_struct.timestamp, 'ConvertFrom', 'posixtime', 'Format', 'yyyy-MM-dd');
T.("日期") = t;
T.("开盘") = short_struct.indicators.quote.open;
T.("最高") = short_struct.indicators.quote.high;
T.("最低") = short_struct.indicators.quote.low;
T.("收盘") = short_struct.indicators.quote.close;
% T.("调整后的收盘价") = short_struct.indicators.adjclose.adjclose;
T.("成交量") = short_struct.indicators.quote.volume;
% 保存表格到Excel文件
writetable(T, filename);
disp(['数据已保存到文件:', filename]);
resp = response;
end
3.2 调用示例
clear
clc
% 输入股票代号、开始日期、结束日期和保存的文件名
symbol = 'TSLA'; % 特斯拉股票
start_date = '2024-01-01';
end_date = '2024-12-26';
filename = 'TSLA_data_2024.xlsx';
out = fetch_and_save_stock_data(symbol, start_date, end_date, filename);
四、雅虎财经股票、指数代码
这些也可以去雅虎财经看,这里列出少数几个。
4.1 指数
指数名称 | 雅虎财经代号 |
---|---|
标普500指数 | ^GSPC |
纳斯达克综合指数 | ^IXIC |
道琼斯工业平均指数 | ^DJI |
标普/TSX 综合指数(加拿大) | ^GSPTSE |
欧洲斯托克50指数 | ^STOXX50E |
中国沪深300指数 | 000300.SS |
香港恒生指数 | ^HSI |
德国DAX指数 | ^GDAXI |
日经225指数 | ^N225 |
英国富时100指数 | ^FTSE |
澳大利亚S&P/ASX 200指数 | ^AXJO |
法国CAC 40指数 | ^FCHI |
印度BSE Sensex指数 | ^BSESN |
俄罗斯RTS指数 | ^RTSI |
4.2 股票
公司名称 | 雅虎财经股票代号 |
---|---|
苹果公司 (Apple) | AAPL |
亚马逊 (Amazon) | AMZN |
微软公司 (Microsoft) | MSFT |
谷歌母公司 (Alphabet) | GOOGL |
特斯拉 (Tesla) | TSLA |
英伟达 (NVIDIA) | NVDA |
Facebook (Meta) | META |
波音 (Boeing) | BA |
奔驰 (Mercedes-Benz) | MBG.DE |
可口可乐 (Coca-Cola) | KO |
强生公司 (Johnson & Johnson) | JNJ |
迪士尼 (Disney) | DIS |
赛富时 (Shopify) | SHOP |
星巴克 (Starbucks) | SBUX |
美国银行 (Bank of America) | BAC |
高盛 (Goldman Sachs) | GS |
英特尔 (Intel) | INTC |
花旗银行 (Citigroup) | C |
五、GUI界面、可执行程序
懒得写,这个很简单们就是拉几个框,设置一下回调。
需要的可以付费给你弄个。