当前位置: 首页 > article >正文

【MATLAB】股票(和指数)数据下载--雅虎财经

文章目录

  • 一、构建请求
  • 二、响应解读及整理
    • 2.1 响应
    • 2.2 数据提取和保存
  • 三、通用函数
    • 3.1 函数
    • 3.2 调用示例
  • 四、雅虎财经股票、指数代码
    • 4.1 指数
    • 4.2 股票
  • 五、GUI界面、可执行程序

雅虎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界面、可执行程序

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

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


http://www.kler.cn/a/454844.html

相关文章:

  • .NET能做什么?全面解析.NET的应用领域
  • QML自定义DelayButton(带进度的按钮)样式
  • kafka的备份策略:从备份到恢复
  • JS 异步 ( 一、异步概念、Web worker 基本使用 )
  • 开发微信小程序的过程与心得
  • B端UI设计规范是什么?
  • MyBatis X 插件只有xml文件目录显示图标的原因?
  • ARM学习(39)ARM-GCC编译出的Bin文件过大解决方案
  • 使用 OWASP Dependency-Check 扫描 Spring Framework 漏洞
  • YOLOv9-0.1部分代码阅读笔记-train.py
  • 数据库索引与 MVCC:原理、应用及事务隔离
  • 什么是Ceph?它的技术特点是什么?部署挑战及解决方案如何?
  • Joget研究——Joget8商业版部署
  • 2024-2030全球防臭包行业调研及趋势分析报告
  • Scrapy: log日志模块的设计详解下
  • Web漏洞之CSRF和SSRF
  • 支持向量机入门指南:从原理到实践
  • 前端图像处理(二)
  • docker 容器中没有ping命令和ifconfig命令和wget怎么办?
  • LeetCode-Z 字形变换(006)
  • layui动态拼接生成下拉框验证必填项失效问题
  • 曼哈顿图如何指定不同染色体不同的颜色
  • 【Linux命令】ps -a 和 ps -ef 的区别
  • MySQL 服务正在启动.MySQL 服务无法启动.服务没有报告任何错误。请键入 NET HELPMSG 3534 以获得更多的帮助。总结较全 (已解决)
  • 香港站群服务器如何排查 Linux 系统的内存泄漏问题
  • 远程作业专家指导调度系统