matlab 从 tushare 获取历史数据

1. matlab 从 tushare 获取历史数据

  • 1. matlab 从 tushare 获取历史数据

  • 1.1. 引言

  • 1.2. 准备工作

    • 1.2.1. 注册 tushare 账号

    • 1.2.2. 获取 token

    • 1.2.3. 下载 tusharematlabsdk

    • 1.2.4. 特别提示

  • 1.3. 获取数据实例

    • 1.3.1. 获取股票日线行情数据

    • 1.3.2. 通用行情调用股票行情数据

    • 1.3.3. 获取每日基本指标数据

    • 1.3.4. kmv 模型获取财务数据

    • 1.3.5. 总结

1.1. 引言

做量化研究,数据是必不可少的,然而市面主流数据提供商的终端产品(wind之类),价格高昂,不是一般人(穷学生)能承受得起的。而自己写爬虫去搜集数据,一来是比较有技术含量,初学者一般难以做到这一点,二来也费时费力。

就目前而言,免费的数据源方面 tushare 无疑是最强的。非常感谢 tushare 的开发者们,为穷苦大众造了件神器 :smile:。

目前,可以通过 http,python,matlab,r等四种语言调用 tushare 数据。然而 tushare 官网对 matlab 调用 tushare 数据介绍过于简单(tusharematlabsdk 文档中的 readme.txt 介绍会详细一下)。初学者恐怕难以运用,于是我特此写这篇文章来分享 matlab 调用 tushare 数据的心得 :grimacing:。

1.2. 准备工作

1.2.1. 注册 tushare 账号

点击这个连接,进入 tushare 官网注册一个账号(顺便帮博主涨涨积分,权当写这个教程的奖励吧:smile:)。

1.2.2. 获取 token

注册完账号后,进入 tushare 网站的个人主页,找到接口TOKEN这一页面,复制你自己的 token 以便后续使用。

matlab 从 tushare 获取历史数据_第1张图片

1.2.3. 下载 tusharematlabsdk

官网页面有提供下载方式,也可以到我的csdn资源页面下载。

将下载好的资源解压,将文件所在的目录设为matlab搜索路径。具体做法为,打开 matlab 打开设置路径选项,然后添加你刚才解压的位置,如下:

matlab 从 tushare 获取历史数据_第2张图片

或者等使用时,将其加载到matlab的工作目录中。总之要使 matlab 在调用该函数包内的函数时能搜索得到函数(我一般是选择后一种做法,后文讲解)。

1.2.4. 特别提示

  • 虽然 tushare 是免费的,但是却是积分制,许多数据得有一定积分才能获取,并且每分钟内调取数据次数也是有限制的。每种数据限制不一,具体限制如何,得到官网查看。

  • 要成功使用 matlab 从 tushare 中读取数据,必须使用 2016b 或者更新的版本。

1.3. 获取数据实例

1.3.1. 获取股票日线行情数据

这是第一个例子,我将详细讲解。学会了第一个,调取其他数据是照葫芦画瓢。首先,看官网对股票日线行情数据的描述:

matlab 从 tushare 获取历史数据_第3张图片

官网这边给的示例是 python 的,但是对于 matlab 而言参数方面其实是一样的,不同之处在于函数的写法。

假设当前的工作目录是 example(之前没有将函数包加入搜索路径) ,那么首先得将 matlabtusharesdk 解压到该目录下。

matlab 从 tushare 获取历史数据_第4张图片

具体编写的函数如下:

  
  
  
  
  1. close all

  2. clear

  3. clc

  4. % 加载tushare

  5. addpath(genpath(pwd));

  6. % 替换成你自己的 token

  7. token = '**************c7a25d89f63c0537ac*************************';

  8. api = pro_api(token);

  9. % 读取数据参数设定

  10. start_time = '20180101';

  11. end_time = '20181231';

  12. % 股票代码

  13. stockcode = '000001.SZ';

  14. % 读取数据

  15. df = api.query('daily', 'ts_code',stockcode, 'start_date',start_time, 'end_date',end_time);

其中 addpath(genpath(pwd)); 这句的作用就是把当前目录下,所有的函数都临时加载至搜索路径中,这样我们就可以调用 tusharematlabsdk 了。所谓临时加载,就是说,你如果退出重启了 matlab 这次添加的路径就无效了,这个技巧可以记下,可以避免很多冲突。

运行代码,就可以看到,我们已经成功读取数据:

matlab 从 tushare 获取历史数据_第5张图片


可以继续拓展一下,如何批量读取呢?这个目前来看,只能循环读取(如果有好办法,请不吝赐教)。如下:

  
  
  
  
  1. close all

  2. clear

  3. clc

  4. %% load data

  5. f = '股票名单.xlsx';

  6. [~,stocklist] = xlsread(f);

  7. % 加载tushare

  8. addpath(genpath(pwd));

  9. % 替换成你自己的 token

  10. token = '********************13c7a25d89f63******************';

  11. api = pro_api(token);

  12. % 读取数据参数设定

  13. start_time = '20180101';

  14. end_time = '20181231';

  15. % 循环读取股票数据

  16. nstock = length(stocklist);

  17. % data = cell(1,nstock);

  18. for i = 1:nstock

  19. df = api.query('daily', 'ts_code',stocklist{i}, 'start_date',start_time, 'end_date',end_time);

  20. data = flipud(df);

  21. writetable(data,['2018年 ',stocklist{i},' 数据.xls']);

  22. end

这里读取的股票名包含十个股票代码:

这里随便提一下,因为 tushare 读出来的数据是,从离现在近的日期到远的日期,这与我平时使用的习惯不符,所以用了 flipud 翻转数据。然后 table 格式的数据,使用 writetable 保存非常方便。

特别注意,上图,中 api.daily 形式调用数据在 matlab 中是行不通的。另外图片中还提到了 api.query 形式调用的数据是不复权的。如果需要指定数据,前复权或者后复权则需要使用==通用行情接口==

1.3.2. 通用行情调用股票行情数据

通用行情接口的语法形式如下: data = pro_bar(ts_code, pro_api, start_date, end_date, freq, asset, market, adj, ma, factors, retry_count);

输入参数如下:

  • 输入参数: 不能少于4个

  • ts_code:证券代码,支持股票,ETF/LOF,期货/期权,港股,数字货币,如'000001.SZ','000905.SH'

  • start_date:开始日期  YYYYMMDD, 如'20181001'

  • end_date:结束日期 YYYYMMDD,''表示当前日期

  • freq:支持1/5/15/30/60分钟,周/月/季/年, 如'D'

  • asset:证券类型 E:股票和交易所基金,I:沪深指数,C:数字货币,F:期权/港股/中概美国/中证指数/国际指数,如'E'

  • market:市场代码,默认''

  • adj:复权类型,''不复权,'qfq':前复权,'hfq':后复权

  • ma:均线,支持自定义均线频度,如:ma5/ma10/ma20/ma60/maN,如[],5,10],[5,10,20],有n个MA值,输出就会相应追加列,不足N天的均线值用填充

  • factors因子数据,目前支持以下两种:

  • vr:量比,默认不返回,返回需指定:factor=['vr']

  • tor:换手率,默认不返回,返回需指定:factor=['tor']

  • 以上两种都需要:factor=['vr', 'tor']

  • retry_count:网络重试次数,默认3

使用通用行情接口调用上文数据:

  
  
  
  
  1. close all

  2. clear

  3. clc

  4. % 加载tushare

  5. addpath(genpath(pwd));

  6. token = '***************************f63c0537ac35**********************';

  7. api = pro_api(token);

  8. % 读取数据参数设定

  9. start_time = '20180101';

  10. end_time = '20181231';

  11. % 股票代码

  12. stockcode = '000001.SZ';

  13. % 读取数据

  14. df1 = api.query('daily', 'ts_code',stockcode, 'start_date',start_time, 'end_date',end_time);


  15. % data = pro_bar(ts_code, pro_api, start_date, end_date, freq, asset, market, adj, ma, factors, retry_count);

  16. df2 = pro_bar(stockcode, api,start_time,end_time);

  17. isequal(df1.close,df2.close)

通过 isequal 函数比较发现这两种方式调用数据的结果是完全一致的。

通用行情借口调用数据更具备灵活性。比如,上面代码中需要指定为前复权需要一指定数据频率和证券类型: df2 = pro_bar(stockcode, api,start_time,end_time,'D','E','','qfq');这样才能正确运行,如果没有指定将会返回空值。

这边需要特别注意,如果 end_date 为空,那么表示获取到现在为止的最新数据,如果 start_date 为空那么表示的是从上市到 end_date 为止的数据。

1.3.3. 获取每日基本指标数据

每日指标数据说明页面。

matlab 从 tushare 获取历史数据_第6张图片

编写如下代码即可读取数据:

  
  
  
  
  1. close all

  2. clear

  3. clc

  4. % 加载tushare

  5. addpath(genpath(pwd));

  6. token = '9349af0c4c826464413c7a25d89f63c0537ac35f4237da3ffa432c25';

  7. api = pro_api(token);

  8. % 读取数据参数设定

  9. start_time = '20180101';

  10. end_time = '20181231';

  11. % 股票代码

  12. stockcode = '000001.SZ';

  13. % 读取数据

  14. df1 = api.query('daily_basic', 'ts_code', stockcode, 'start_date',start_time,'end_date',end_time,...

  15. 'fields','ts_code,trade_date,turnover_rate,volume_ratio,pe,pb');

matlab 从 tushare 获取历史数据_第7张图片

1.3.4. kmv 模型获取财务数据

获取资产负债表和财务指标数据,这些只要依照 tushare 说明页面上的例子,把 matlab 的参数写对就行了,参考 api.query 形式读取数据的例子即可:

  
  
  
  
  1. close all

  2. clear

  3. clc

  4. % 加载tushare

  5. addpath(genpath(pwd));

  6. token = '9349af0c4c826464413c7a25d89f63c0537ac35f4237da3ffa432c25';

  7. api = pro_api(token);

  8. % 读取数据参数设定

  9. start_time = '20180101';

  10. end_time = '20181231';

  11. % 股票代码

  12. stockcode = '000001.SZ';

  13. % 读取数据

  14. % 资产负债表

  15. df2 = api.query('balancesheet', 'ts_code',stockcode,'start_date',start_time,'end_date',end_time,...

  16. 'fields','ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,cap_rese');


  17. % 财务指标数据 获取每股净资产数据

  18. df3 = api.query('fina_indicator', 'ts_code',stockcode, 'start_date',start_time,'end_date',end_time);

上面学了这么多,现在这里就写一个用 tushare 读取财务数据的真实例子(用来做 kmv 模型的),这是读取数据的函数:

  
  
  
  
  1. function [ve,vd,deltaE,N] = getStockData(stockcode,start_time,end_time,api,nn)

  2. % 该函数从tushare读取每只股票数据并进行计算

  3. % nn 为长期负债乘数


  4. %% 获取财务数据

  5. df2 = api.query('balancesheet', 'ts_code',stockcode,'start_date',start_time,'end_date',end_time,...

  6. 'fields','ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,cap_rese');

  7. % 取计算期内最新的一次报表作为计算依据

  8. % 债务账面价值=短期流动负债 + 0.5*长期负债



  9. try

  10. % 为避免触发读取权限限制,限速

  11. pause(0.4);

  12. vd = df2.total_cur_liab(1) + nn*df2.total_ncl(1);

  13. catch

  14. if isempty(df2.total_ncl{1})

  15. df2.total_ncl{1} = 0;

  16. end

  17. vd = df2.total_cur_liab(1) + nn*df2.total_ncl{1};

  18. end

  19. % 获取每股净资产数据

  20. df3 = api.query('fina_indicator', 'ts_code',stockcode, 'start_date',start_time,'end_date',end_time);

  21. %% 时间

  22. % 读取交易日历

  23. df4 = api.query('trade_cal','start_date',start_time, 'end_date',end_time);

  24. ind = df4.is_open == 1;

  25. df4 = df4(ind,:);

  26. trade_date = size(df4,1);

  27. %% 获取每日指标数据

  28. df1 = api.query('daily_basic', 'ts_code', stockcode, 'start_date',start_time,'end_date',end_time,'fields','ts_code,trade_date,turnover_rate,volume_ratio,pe,pb');

  29. % 计算 每日股权价值=流通股股数*股票日收盘价+非流通股股数*每股净资产

  30. % 注意读取出来的数据中的股本单位是万股,因此要乘以10000

  31. % 计算股权价值

  32. ve = df1.close .* df1.float_share + (df1.total_share-df1.float_share) .* df3.bps(1);

  33. ve = ve * 10000;

  34. % 计算股权价值收益率

  35. % 计算收益率时注意将股票日期翻转成matlab中的顺序

  36. % ret = price2ret(flipud(df1.close));

  37. ret = price2ret(flipud(df1.close));

  38. % 求平均每日股权价值

  39. % ve = mean(ve);

  40. % 取最后一天的股权价值

  41. ve = ve(1);

  42. % N 为股票实际交易天数

  43. N = size(df1,1);


  44. % md = garch(1,1);

  45. % estMd = md.estimate(ret,'Display','off');

  46. % % 无条件方差即波动率计算

  47. % sigma = estMd.Constant/(1-estMd.GARCH{1}-estMd.ARCH{1});

  48. % deltaE = sqrt(sigma*trade_date);


  49. % 计算股权价值波动率

  50. delta_day = std(ret);

  51. % 年化股权价值波动率

  52. deltaE = delta_day*sqrt(trade_date);


  53. end

而这个是调用这个函数获取数据的脚本:

  
  
  
  
  1. close all

  2. clear

  3. clc


  4. %% excel文件中读取要计算的股票名单

  5. f = '股票选择.xls';

  6. [~,sheet] = xlsfinfo(f);

  7. sheet = sheet{4};

  8. [~,~,stocktable] = xlsread(f,sheet);

  9. % 因为数据中不同轮数的股票数量不同

  10. temp = stocktable(3:end,3);

  11. temp = double(string((temp)));

  12. % nn = find(isnan(temp));

  13. nn = length(temp);

  14. % nn = nn -1 + 2;

  15. nn = nn + 2;


  16. list = [stocktable(3:nn,2:3);stocktable(3:nn,4:5);stocktable(3:nn,6:7)];


  17. % 将股票代码加上.SZ或者.SH

  18. temp = list(:,2);

  19. num = double(string(temp));

  20. nstock = length(list);

  21. for i=1:nstock

  22. if num(i) < 100000

  23. list{i,2} = [list{i,2},'.SZ'];

  24. else

  25. list{i,2} = [list{i,2},'.SH'];

  26. end

  27. end

  28. %% tushare中读取数据

  29. % 加载tushare

  30. addpath(genpath(pwd));

  31. % 自己的 token

  32. token = '******************f63c0537ac35f4237d**************';

  33. api = pro_api(token);

  34. % 设定数据时间

  35. start_time = '20180101';

  36. end_time = '20181231';

  37. % 预定义数据矩阵,[ve,vd,deltaE]

  38. ve = nan(nstock,1);

  39. vd = nan(nstock,1);

  40. deltaE = nan(nstock,1);

  41. N = nan(nstock,1);

  42. nn = 0.5;

  43. % 循环读取

  44. for i=1:nstock

  45. stockcode = list{i,2};

  46. [ve(i),vd(i),deltaE(i),N(i)] = getStockData(stockcode,start_time,end_time,api,nn);

  47. disp(['第',num2str(i),'只股票',stockcode,' 读取成功']);

  48. end

  49. data = table(ve,vd,deltaE,N);

  50. save('stockdata.mat','data','list','stocktable','start_time','sheet')

  51. disp([start_time(1:4),' ',sheet,' 数据读取成功']);

这里股票选择文件数据如下,为了方便大家学习复现结果已经将文件上传,点击下载:

matlab 从 tushare 获取历史数据_第8张图片

运行代码即可在命令中输出如下结果:matlab 从 tushare 获取历史数据_第9张图片

1.3.5. 总结

目前就暂时写这么多吧,万变不离其宗,调用数据时把格式写对就行。另外确实有时候 tushare 自己或出错,看这里。但是这种情况非常少见(我只碰到过一次),而且一般也会很快得到修复。如果有任何疑问,欢迎留言交流 :grin:。


你可能感兴趣的:(matlab 从 tushare 获取历史数据)