雅虎2021年就退出中国了,你懂的。

能下载股票等数据的财经网站、软件也很多。我写着玩的。

一、构建请求

去雅虎财经网站,随便选择一个指数,或者搜索一个股票,点击历史数据,即可看到历史数据:

在这里插入图片描述

然后打开浏览器检查,网络选项,清除之前的请求,重新选择感兴趣的日期后加载,即可看到数据请求的api,右键复制curl(bash)格式。
在这里插入图片描述
然后生成对应语言的网络请求即可:https://curlconverter.com/

比如本文的matlab。

当然你也可以自己根据标头、载荷手动构建请求。


以标普500指数为例:

❄️载荷 payload:

period1period2是开始时间和结束时间的时间戳: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界面、可执行程序

懒得写,这个很简单们就是拉几个框,设置一下回调。

需要的可以付费给你弄个。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐