Matlab量化数据获取利器:Tushare Pro SDK封装详解
2026/9/12 0:07:05 网站建设 项目流程

简介:面向MATLAB金融数据分析场景的tushare_matlab_sdk.zip,是为需要获取中国A股行情、财务及交易数据的量化研究者与工程师准备的轻量工具包。压缩包共8个文件,包含6个m脚本和2个txt说明文档,整体仅15KB。m脚本涵盖网络请求封装、日K线数据拉取、通用API调用、HTTP头参数处理以及现成测试脚本,txt文档则提供基础使用说明与tushare积分获取方法,方便用户按需查阅。已有396人学习或下载,说明该工具包在MATLAB社区具有一定的实用参考价值。通过核心API与日线数据拉取函数,使用者可以快速完成token配置、日线数据获取与简单可视化,同时理解如何在MATLAB中扩展tushare的接口调用;对于想将金融数据接入MATLAB分析流程的初学者,这份资料能显著降低入门门槛,并为进一步开发量化策略提供基础支撑。 做量化或者金融数据分析的朋友,多数都体会过“找数据”比“写策略”还痛苦的阶段。tushare_matlab_sdk.zip这个项目,说白了就是把 tushare pro 的 HTTP 接口封装成 Matlab 里可以直接调用的函数,让你不用自己拼 URL、写 JSON 解析、处理鉴权,直接在 Matlab 命令行里几行代码拉数据。tushare 是目前国内量化圈用得比较多的金融数据源,Matlab 则是工科和金融工程领域最顺手的计算工具,两者碰上,SDK 压缩包一解压,数据问题就解决了一大半。

这个包适合谁?我觉得主要是三类人:一是正在做量化策略回测但被数据源折腾的学生,二是金融工程、运筹、计量方向的科研党,三是想快速验证某个交易想法的个人投资者。它解决的核心问题很直接:把“从 tushare 拿数据”这个动作,从写脚本、调接口、处理异常,压缩成一行代码。下面我会从功能拆解、环境配置、常用接口到踩坑记录,完整过一遍这个 SDK 的使用过程。

1. tushare_matlab_sdk 能做什么:核心功能拆解

1.1 为什么选 tushare pro + Matlab 这套组合

先聊一个经常被问的问题:现在 Python 做量化那么火,为什么还要用 Matlab 调 tushare?我的理解是,工具没有绝对的优劣,只有顺手不顺手。Matlab 在矩阵运算、金融工具箱、绘图和交互式探索方面有天然优势,很多老牌金融模型和课程设计代码都是 Matlab 写的。如果你的回测框架、风险模型已经跑在 Matlab 里,再去用 Python 单独拉数据再导进来,中间多了一层格式转换和文件传输,反而容易出错。

tushare pro 这边,数据覆盖面确实够全:股票日线、分钟线、财务指标、指数、基金、期货、宏观数据都有,接口按积分分级开放。对于科研和个人研究来说,免费额度基本够用。tushare_matlab_sdk的出现,相当于把 tushare 的 HTTP API 翻译成了 Matlab 的函数调用,让不熟悉 Web 编程的人也能快速上手。

1.2 SDK 压缩包的内部结构

拿到tushare_matlab_sdk.zip后,建议先看一下解压出来的目录结构。常见的布局大概是这样的:

tushare_matlab_sdk/ ├── README.md ├── api/ │ ├── tushare.m % 核心入口:token设置、通用取数函数 │ ├── pro_bar.m % 行情数据专用函数,支持复权、分钟线 │ └── ... ├── utils/ │ ├── request.m % HTTP请求封装,基于 webread/webwrite │ ├── json_decode.m % 老版本兼容用的JSON解析 │ └── ... └── examples/ ├── demo_daily.m % 日线数据示例 ├── demo_finance.m % 财务数据示例 └── ...

不同版本的 SDK 文件结构会有些差异,但核心思路一致:api目录放对外暴露的函数,utils目录放内部依赖工具。我建议你拿到包之后,先花五分钟看一遍README.md,里面通常会写明最低 Matlab 版本要求、需要哪些工具箱、token 在哪里填,这些信息能避开很多后续的坑。

1.3 典型应用场景举例

这个 SDK 能覆盖的场景比想象中要多:

  • 日线数据批量下载:把全市场股票的日线数据拉到本地,存成 CSV 或 MAT 文件,供回测和因子计算使用。
  • 财务指标筛选:用incomebalancesheet等接口拉取上市公司财报数据,做基本面量化选股。
  • 交易日历同步:用trade_cal接口获取交易日历,矫正你的回测日期序列。
  • 宏观数据获取:把 CPI、PMI 等宏观指标拉进 Matlab,做多资产配置研究。

这些场景的共同点是“数据量大、格式要求规范、需要反复调用”,SDK 正好把这些重复劳动封装掉了。

2. 环境准备与安装:从下载到跑通第一个接口

2.1 环境依赖清单

在解压之前,先把环境捋一遍。这个 SDK 正常工作需要满足几个前提,缺一个都可能白折腾:

依赖项要求说明
Matlab 版本R2016b 及以上因为用到jsondecode,老版本会有兼容问题
tushare pro 账号注册并获取 token官网注册后在个人主页复制
tushare 积分建议 120 分以上部分接口有积分门槛,比如分钟线、财务高频
网络环境能访问 tushare.pro有些内网环境需要配代理
解压工具7-Zip 或 WinRAR系统自带资源管理器亦可,但不如 7-Zip 稳

如果你的 Matlab 版本比较老(比如 R2014a),运行时会直接报Undefined function or variable 'jsondecode',这时候要么升级版本,要么给 SDK 打补丁,把 JSON 解析替换成第三方的JSON.parse实现,但前者显然更省心。

2.2 正确解压 zip 包并配置路径

很多人第一步就栽在解压上。zip文件如果下载不完整,会报invalid zip archive: could not find eocd,这个我们后面在常见问题里详细说。这里先讲正常流程:

  1. tushare_matlab_sdk.zip放到一个纯英文路径下,比如D:\Work\tushare_matlab_sdk,尽量避免中文和空格。
  2. 右键解压到当前文件夹,确认解压出来的目录名是tushare_matlab_sdk
  3. 打开 Matlab,在“主页”选项卡里找到“设置路径”,点“添加并包含子文件夹”,选中刚才的目录,保存。
  4. 在命令行窗口运行addpath(genpath('D:\Work\tushare_matlab_sdk')),确保当前会话里函数可用。

第 2 步特别提醒一下:如果解压后出现中文乱码的文件夹名,大概率是压缩包编码和操作系统编码不一致。这种情况在 Windows 上偶尔出现,你只需要手动把文件夹重命名为英文即可,不影响功能。

2.3 设置 token 并验证连通性

路径配置好以后,第一件事是设置 token。token 相当于你访问 tushare 的钥匙,在 tushare pro 官网登录后,点头像进入“个人主页”,就能看到一串 token 字符。把它填到 SDK 里:

% 一次性设置token tushare.token('你的token字符串');

设置完成后,可以先拉一个交易日历小数据测试连通性:

cal = tushare.trade_cal(exchange='SSE', start_date='20240101', end_date='20240110'); disp(cal);

如果返回一个 table 对象,里面有cal_dateis_open等字段,说明 token 配置正确、网络也通。我第一次跑这条命令时返回了 10 行日历数据,瞬间踏实了。

2.4 快速测试:拉取第一份日线数据

连通性没问题后,直接试核心函数pro_bar。这个函数专门用来拉行情数据,支持复权因子和分钟线参数:

df = tushare.pro_bar(ts_code='000001.SZ', start_date='20240101', end_date='20240131', freq='D');

ts_code是证券代码,格式是“6位代码.交易所”,.SZ代表深交所,.SH代表上交所。运行后返回的是 table,包含trade_dateopenhighlowclosevolamount这些列。你可以在命令行里用head(df)查看前几行。

至此,第一个接口已经跑通了。剩下的问题就是怎么把这套东西用熟练、用顺手,以及遇到各种报错怎么排查。

3. 核心方法解析:常用接口与调用方式

3.1 pro_bar 函数:行情数据一把梭

pro_bar是整个 SDK 里我使用频率最高的函数,没有之一。它的参数设计比较人性化,常用的几个参数这样用:

% 前复权日线 df = tushare.pro_bar(ts_code='600519.SH', start_date='20230101', end_date='20231231', adj='qfq'); % 30分钟K线 df_min = tushare.pro_bar(ts_code='600519.SH', start_date='20240101', end_date='20240115', freq='30min');

adj参数有三个可选值:空(不复权)、qfq(前复权)、hfq(后复权)。做回测时复权处理非常重要,否则分红除权会让你的收益率计算失真。我用qfq比较多,因为它模拟的是“你从过去某个时点买入持有至今”的收益视角。

freq参数支持D(日线)、W(周线)、M(月线)以及1min5min15min30min60min等分钟线。需要注意,分钟线数据对 tushare 积分要求高,普通注册账号基本调不了,需要 5000 积分以上才稳定。所以如果你没攒够积分,老老实实用日线和周线就够了。

3.2 股票列表与财务指标接口

做量化选股,光有行情数据不够,还得有股票列表和财务数据。stock_basic接口可以拉全市场的股票基础信息:

basic = tushare.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,industry,list_date');

这里list_status='L'表示上市状态,L是上市、D是退市、P是暂停上市。fields参数可以只取你需要的字段,减少网络传输量。

财务数据方面,income接口可以拉利润表关键科目。比如拉某只股票最近四个季度的净利润:

fin = tushare.income(ts_code='000001.SZ', start_date='20230101', end_date='20231231', fields='ts_code,end_date,revenue,n_income');

返回的数据里,end_date是报告期,revenue是营业收入,n_income是净利润。建议在拉财务数据时按报告期筛选,因为一个公司每年会有多期报告,不筛选的话会把季报、中报、年报都拉回来,数据量大而且容易看花眼。

3.3 数据格式与类型转换技巧

SDK 返回的数据统一是 Matlab 的table类型,字段名和 tushare 接口文档保持一致。这本是好事,但有一个坑:日期字段是字符串格式,比如'20240115',不是datetime类型。所以在做时间序列计算前,建议先转一下:

df.trade_date = datetime(df.trade_date, 'InputFormat', 'yyyyMMdd');

另外,数值字段openhighlowclose在接口返回里可能是字符串或数值型,取决于 SDK 版本。建议拉完数据后统一用str2doubletable2array处理。我自己的习惯是写一个format_tsdata小函数,把日期、数值、缺失值一次性清理干净,后续做策略会省很多事。

4. 常见问题与排查技巧实录

4.1 解压报错 invalid zip archive / could not find eocd

这是下载文件最常见的坑。eocd全称是 End of Central Directory Record,zip 压缩包文件末尾必须有这个标记,如果下载过程中断、文件不完整,就会报could not find eocd。遇到这个错误,先别急着试各种修复工具,直接重新下载一次,用 7-Zip 或浏览器自带的下载管理下载,尽量别用多线程下载工具,避免文件被截断。

如果你是在服务器上用命令行解压,可以用zip -T检查压缩包完整性,或者直接重新上传文件到服务器再解压。实际验证下来,90% 的 eocd 报错都是文件没下全,重新下载基本能解决。另外提醒一句:不要下载那种来源不明的“密码保护版”SDK 压缩包,万一密码不对,网上所谓“zip 密码破解工具”大多无效,还浪费时间,直接找文件提供者要密码才是正道。

4.2 SDK 版本与 Matlab 版本不兼容

SDK 里的jsondecode依赖 Matlab R2016b 以上版本。如果你用老版本,运行时报错比较明确:

Undefined function or variable 'jsondecode'

这种情况有两个解法:一是升级 Matlab,二是改造utils下的json_decode.m,把jsondecode替换成开源的 JSON 解析函数(比如 DataStore 或者 JSONio 工具箱)。但说实话,老版本 Matlab 就算解决了 JSON 解析,其他内置函数也可能有兼容问题,升级到 R2016b 以上是最省事的选择

类似的还有函数名冲突问题。如果你自己写过叫request.mtushare.m的文件,又在同一个路径下运行 SDK,Matlab 可能会调用错函数。排查方法是在命令行运行which tushare,看当前到底调用的是哪个文件。

4.3 token 失效、积分不足与请求频率超限

tushare 接口的报错信息都是数字代码,最常遇到的几个:

报错代码含义解决办法
20002权限不足,接口需要更高的积分去 tushare pro 官网完成积分任务或充值
20003每分钟请求次数超限降低请求频率,加pause(0.5)之类的间隔
20004每秒请求次数超限同样加间隔,或使用批量接口减少调用次数

token 失效的问题相对少见,一般是你自己在 tushare 官网重置过 token,旧的就会失效。解决办法是重新复制 token 再执行一次tushare.token('新token')。如果是在脚本里写死的 token,记得同步更新,否则下次运行还是老的。

积分不足是最容易卡住新手的地方。tushare 的接口分不同积分门槛,比如日线基础接口 120 积分就够,但分钟线、财务高频接口需要几千积分。我的经验是:先把基础的日线和 stock_basic 接口用熟,等有真实需求了再考虑升级积分,不要一开始就奔着全接口去。

4.4 网络代理与防火墙导致的连接失败

在部分公司内网或实验室网络环境下,Matlab 访问外网需要走代理。此时直接调 SDK 会报连接超时或“无法解析服务器名称”,比如:

Error using webread (line X) Unable to resolve the name: api.tushare.pro

排查思路分三步:第一步,确认在浏览器里能否打开tushare.pro官网;第二步,如果浏览器可以但 Matlab 不行,大概率是 Matlab 没有继承系统代理设置;第三步,在 Matlab 的“预设项”里找到 Web 选项,手动填上代理服务器地址和端口。还有一种情况是防火墙拦截了 Matlab 的 HTTP 请求,这时候需要联系网络管理员放行api.tushare.pro域名。

这里要强调一下,正常访问 tushare 官网和接口不需要任何“特殊工具”,如果连官网都打不开,先检查本地网络环境。

4.5 中文乱码与数据导出问题

用 SDK 拉到的数据如果包含中文(比如股票名称、行业名称),在 Matlab 命令行显示正常,但导出成 CSV 后用 Excel 打开可能乱码。这是因为 Excel 默认按 ANSI 编码读取 CSV,而writetable默认输出UTF-8。解决办法有两个:

% 方法1:指定编码为系统编码 writetable(df, 'data.csv', 'Encoding', 'system'); % 方法2:转成 xlsx 格式 writetable(df, 'data.xlsx');

我建议优先用.xlsx格式,Excel 打开没有乱码问题,而且还能保留数据格式。如果你必须输出 CSV 给其他程序用,那保持 UTF-8 不加'Encoding', 'system'反而更通用。

4.6 常见问题速查表

把上面的排查逻辑整理成速查表,方便实际使用的时候对照:

现象可能原因处理方式
解压报could not find eocd下载不完整或文件损坏重新下载,用 7-Zip 验证
jsondecode未定义Matlab 版本过老升级到 R2016b+ 或替换 JSON 解析器
报错 20002积分不足提升 tushare 积分
报错 20003/20004请求频率超限增加等待时间,降低调用频率
Unable to resolve the name网络代理或 DNS 问题配置代理或检查网络
中文乱码编码格式不匹配导出 xlsx 或指定编码

写在最后的实操心得

这个 SDK 我实际用了大概两个月,最大的体会是:它不是一个让你“装完就忘”的工具,而是一个需要二次改造的起点。官方包里只封装了最基础的请求逻辑,真正用起来顺不顺,取决于你怎么扩展它。我后来自己加了三样东西:本地缓存、批量请求、失败重试。本地缓存解决的是“重复拉同一只股票数据”的浪费问题,第一次拉到后存成.mat文件,后续直接加载;批量请求解决的是“全市场股票日线数据”的下载效率问题,用循环加pause控制频率;失败重试解决的是某次网络抖动导致的数据缺失,配合try-catch自动重跑。

最后再分享一个小技巧:tushare 返回的trade_date字段是字符串,很多初学者拿过去直接画图,结果横轴乱序。我用datetime转换后,再用sortrows排序,数据才是正确的时间序列。你如果要做多个股票的对比,建议把数据统一存成“宽表”格式:行是日期,列是股票代码,数值是收盘价,这样后面做相关性分析和因子计算都会方便很多。总之,工具是死的,用法是活的,多折腾几次,你就能找到最适合自己的一套工作流。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询