《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 68831|回复: 1093
收起左侧

[源码] Matlab通过Yahoo与Sina获取历史与实时股票数据[faruto版本]

    [复制链接]
发表于 2013-11-27 10:50:48 | 显示全部楼层 |阅读模式
本帖最后由 faruto 于 2013-11-27 14:24 编辑

通过访问Yahoo和Sina的URL进行股票数据的提取,其中部分函数的实现是基于 郑志勇兄弟( ariszheng @http://www.ariszheng.com/) 的相关函数进行修改优化而成。
这部分东西一直想抽时间弄来着,这段有点犯懒。O(∩_∩)O  

历史数据通过YahooData.m函数实现,访问的Yahoo的URL形式为
  1. url2Read=sprintf(...
  2.     'http://ichart.finance.yahoo.com/table.csv?s=%s&a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&g=%s&ignore=.csv', StockName, ms, ds, ys, me, de, ye, Freq);
复制代码
可以获取某一股票的日、周、月 的历史数据。

实时数据通过SinaData.m函数实现,访问的Sina的URL形式为
  1. url2Read=['http://hq.sinajs.cn/list=',StockCode];
复制代码
可以获取某一股票的实时数据,进而再结合timer函数就可以获取某一股票当天的实时行情(这部分懒得弄了)。

测试脚本 SinaYahooDataTest.m
  1. %% SinaYahooDataTest
  2. % by LiYang
  3. % Email:farutoliyang@gmail.com
  4. % 2013/11/26
  5. %% A Little Clean Work
  6. tic;
  7. clear;
  8. clc;
  9. close all;
  10. format compact;
  11. %% 获取历史数据测试

  12. % 历史数据通过Yahoo接口获得 (历史数据为未复权数据,使用时候请注意)
  13. % Yahoo中证券代码为 (上海 .ss 深圳 .sz),例如招商银行,600036.ss

  14. StockName = '600036.ss';
  15. StartDate = today-200;
  16. EndDate = today;
  17. Freq = 'd';
  18. [DataYahoo, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq);

  19. % K线展示
  20. scrsz = get(0,'ScreenSize');
  21. figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

  22. Open = DataYahoo(:,2);
  23. High = DataYahoo(:,3);
  24. Low = DataYahoo(:,4);
  25. Close = DataYahoo(:,5);
  26. MT_candle(High,Low,Close,Open,[],Date_datenum);
  27. xlim( [0 length(Open)+1] );
  28. title(StockName);
  29. %% 获取实时数据测试
  30. % Sina中证券代码为 (sh. 上海 sz.深圳),例如招商银行sh600036

  31. StockCode='sh600036';
  32. [DataSina, DataCell]=SinaData(StockCode);
  33. DataCell
  34. %% Record Time
  35. toc;
复制代码
运行结果
1.jpg
  1. DataCell =
  2.     '招商银行_sh600036'    '股票名称代码'         
  3.     '2013-11-27'           '日期'                  
  4.     '10:28:22'             '时间'                  
  5.     [          10.8400]    '今开盘'               
  6.     [          10.8300]    '昨收盘'               
  7.     [          10.7800]    '当前价'               
  8.     [          10.8500]    '今最高'               
  9.     [          10.7600]    '今最低'               
  10.     [          10.7700]    '竞买价,即“买一”报价'
  11.     [          10.7800]    '竞卖价,即“卖一”报价'
  12.     [         11165602]    '成交量,单位“股”'   
  13.     [        120618712]    '成交额,单位“元”'   
  14.     [            17119]    '买一量'               
  15.     [          10.7700]    '买一价'               
  16.     [           348053]    '买二量'               
  17.     [          10.7600]    '买二价'               
  18.     [           509400]    '买三量'               
  19.     [          10.7500]    '买三价'               
  20.     [           129800]    '买四量'               
  21.     [          10.7400]    '买四价'               
  22.     [           236600]    '买五量'               
  23.     [          10.7300]    '买五价'               
  24.     [            36790]    '卖一量'               
  25.     [          10.7800]    '卖一价'               
  26.     [            50257]    '卖二量'               
  27.     [          10.7900]    '卖二价'               
  28.     [           158371]    '卖三量'               
  29.     [          10.8000]    '卖三价'               
  30.     [           143496]    '卖四量'               
  31.     [          10.8100]    '卖四价'               
  32.     [            33665]    '卖五量'               
  33.     [          10.8200]    '卖五价'  
复制代码
YahooData.m函数源码
  1. function [Data, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq)
  2. % by LiYang(faruto) @http://www.MATLABsky.com
  3. % 本函数是基于 ariszheng @http://www.ariszheng.com/ 的相关函数进行修改而成
  4. % 用来通过Yahoo获取股票历史数据
  5. % 历史数据通过Yahoo接口获得 (历史数据为未复权数据,使用时候请注意)
  6. %% 输入参数
  7. % StockName 证券代码(上海 .ss 深圳 .sz)
  8. % StartDate, EndDate 时间段的开始日与结束日
  9. % Freq 频率
  10. %% 测试函数
  11. % StockName = '600036.ss';
  12. % StartDate = today-200;
  13. % EndDate = today;
  14. % Freq = 'd';
  15. % [DataYahoo, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq);

  16. %% 数据时间区间
  17. startdate=StartDate;
  18. enddate=EndDate;
  19. %字符串变化
  20. ms=num2str(str2double(datestr(startdate, 'mm'))-1);
  21. ds=datestr(startdate, 'dd');
  22. ys=datestr(startdate, 'yyyy');
  23. me=num2str(str2double(datestr(enddate, 'mm'))-1);
  24. de=datestr(enddate, 'dd');
  25. ye=datestr(enddate, 'yyyy');

  26. % s: 股票代码 (e.g. 002036.SZ 300072.SZ 600036.SS 等)
  27. % c-a-b: 起始日期年、月、日 (月份的起始索引为0) 2010-5-11 = 2010年6月11日
  28. % f-d-e: 结束日期年、月、日 (月份的起始索引为0) 2010-7-23 = 2010年8月23日
  29. % g: 时间周期。d=每日,w=每周,m=每月,v=只返回除权数据
  30. % 省略所有参数,只制定股票代码时,返回所有历史数据
  31. url2Read=sprintf(...
  32.     'http://ichart.finance.yahoo.com/table.csv?s=%s&a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&g=%s&ignore=.csv', StockName, ms, ds, ys, me, de, ye, Freq);

  33. s=urlread_General(url2Read);

  34. Head = ['Date Open High Low Close Volume AdjClose'];
  35. Result=textscan(s, '%s %s %s %s %s %s %s', 'delimiter', ',');

  36. temp = Result{1,1};
  37. Date_datestr = temp(2:end);
  38. Date_datestr = Date_datestr(end:(-1):1);

  39. temp = Result{1,2};
  40. temp = cellfun(@str2double, temp(2:end));
  41. temp = temp(end:(-1):1);
  42. Open = temp;

  43. temp = Result{1,3};
  44. temp = cellfun(@str2double, temp(2:end));
  45. temp = temp(end:(-1):1);
  46. High = temp;

  47. temp = Result{1,4};
  48. temp = cellfun(@str2double, temp(2:end));
  49. temp = temp(end:(-1):1);
  50. Low = temp;

  51. temp = Result{1,5};
  52. temp = cellfun(@str2double, temp(2:end));
  53. temp = temp(end:(-1):1);
  54. Close = temp;

  55. temp = Result{1,6};
  56. temp = cellfun(@str2double, temp(2:end));
  57. temp = temp(end:(-1):1);
  58. Volume = temp;

  59. temp = Result{1,7};
  60. temp = cellfun(@str2double, temp(2:end));
  61. temp = temp(end:(-1):1);
  62. AdjClose = temp;

  63. Date_datenum = datenum(Date_datestr);
  64. Date_double = str2num( datestr(Date_datenum, 'yyyymmdd') );

  65. Data = [Date_double, Open, High, Low, Close, Volume, AdjClose];

  66. end
复制代码


SinaData.m函数源码

  1. function [Data, DataCell]=SinaData(StockCode)
  2. % by LiYang(faruto) @http://www.matlabsky.com
  3. % 本函数是基于 ariszheng @http://www.ariszheng.com/ 的相关函数进行修改而成
  4. % 用来通过sina获取股票实时数据
  5. %% 输入参数
  6. % StockCode 证券代码(上海sh+code 深圳 sz+code)
  7. %% 测试函数
  8. %提取数据 招商银行(上海交易所)
  9. % StockCode='sh600036';
  10. % [Data, DataCell]=SinaData(StockCode);

  11. %% Sina URL
  12. url2Read=['http://hq.sinajs.cn/list=',StockCode];
  13. s=urlread_General(url2Read);

  14. result=textscan(s,'%s','delimiter', ',');

  15. result = result{1,1};
  16. DataCell = result;
  17. Data = cellfun(@str2double, DataCell(2:30));

  18. temp = cell2mat(DataCell(1));
  19. StockName = temp(22:end);
  20. StockID = temp(12:19);

  21. DataCell{1, 1} = [StockName, '_', StockID];

  22. StockDate = cell2mat( DataCell(31) );
  23. StockTime = cell2mat( DataCell(32) );

  24. DataCell{2, 1} = StockDate;
  25. DataCell{3, 1} = StockTime;

  26. DataCell(4:end-1) = mat2cell( Data, ones(length(Data), 1) );

  27. temp = DataCell(1:32);
  28. DataCell = temp;

  29. ind = 1;
  30. DataCell{ind, 2}  = '股票名称代码';
  31. ind = ind + 1;
  32. DataCell{ind, 2}  = '日期';
  33. ind = ind + 1;
  34. DataCell{ind, 2}  = '时间';
  35. ind = ind + 1;
  36. DataCell{ind, 2}  = '今开盘';
  37. ind = ind + 1;
  38. DataCell{ind, 2}  = '昨收盘';
  39. ind = ind + 1;
  40. DataCell{ind, 2}  = '当前价';
  41. ind = ind + 1;
  42. DataCell{ind, 2}  = '今最高';
  43. ind = ind + 1;
  44. DataCell{ind, 2}  = '今最低';
  45. ind = ind + 1;
  46. DataCell{ind, 2}  = '竞买价,即“买一”报价';
  47. ind = ind + 1;
  48. DataCell{ind, 2}  = '竞卖价,即“卖一”报价';
  49. ind = ind + 1;
  50. DataCell{ind, 2}  = '成交量,单位“股”';
  51. ind = ind + 1;
  52. DataCell{ind, 2}  = '成交额,单位“元”';
  53. ind = ind + 1;
  54. DataCell{ind, 2}  = '买一量';
  55. ind = ind + 1;
  56. DataCell{ind, 2}  = '买一价';
  57. ind = ind + 1;
  58. DataCell{ind, 2}  = '买二量';
  59. ind = ind + 1;
  60. DataCell{ind, 2}  = '买二价';
  61. ind = ind + 1;
  62. DataCell{ind, 2}  = '买三量';
  63. ind = ind + 1;
  64. DataCell{ind, 2}  = '买三价';
  65. ind = ind + 1;
  66. DataCell{ind, 2}  = '买四量';
  67. ind = ind + 1;
  68. DataCell{ind, 2}  = '买四价';
  69. ind = ind + 1;
  70. DataCell{ind, 2}  = '买五量';
  71. ind = ind + 1;
  72. DataCell{ind, 2}  = '买五价';
  73. ind = ind + 1;
  74. DataCell{ind, 2}  = '卖一量';
  75. ind = ind + 1;
  76. DataCell{ind, 2}  = '卖一价';
  77. ind = ind + 1;
  78. DataCell{ind, 2}  = '卖二量';
  79. ind = ind + 1;
  80. DataCell{ind, 2}  = '卖二价';
  81. ind = ind + 1;
  82. DataCell{ind, 2}  = '卖三量';
  83. ind = ind + 1;
  84. DataCell{ind, 2}  = '卖三价';
  85. ind = ind + 1;
  86. DataCell{ind, 2}  = '卖四量';
  87. ind = ind + 1;
  88. DataCell{ind, 2}  = '卖四价';
  89. ind = ind + 1;
  90. DataCell{ind, 2}  = '卖五量';
  91. ind = ind + 1;
  92. DataCell{ind, 2}  = '卖五价';

  93. end
复制代码



其中YahooData.m和SinaData.m函数会用到一个 urlread_General.m 读取网页的函数,是重新封装的,matlab的老版本的urlread再读取中文网页时会有乱码,所以这里做了一些处理。

整理所有函数源码打包下载
Matlab通过Yahoo与Sina获取历史与实时股票数据[faruto版本]
Matlab通过Yahoo与Sina获取历史与实时股票数据[faruto版本].rar (136.84 KB, 下载次数: 1713)

评分

参与人数 1威望 +3 贝壳 +3 贡献 +3 收起 理由
fantuanxiaot + 3 + 3 + 3 感谢您分享自己珍贵的资料

查看全部评分

发表于 2015-8-28 11:01:56 | 显示全部楼层
运行程序出错了
??? Undefined variable "com" or class "com.mathworks.webproxy.WebproxyFactory.findProxyForURL".

Error in ==> urlreadwrite_General>getUrlConnection at 190
proxy = com.mathworks.webproxy.WebproxyFactory.findProxyForURL(url);

Error in ==> urlreadwrite_General at 32
[urlConnection,errorid] = getUrlConnection(urlChar,inputs.timeout,...

Error in ==> urlread_General at 36
[s,status] = urlreadwrite_General(mfilename,catchErrors,url,varargin{:});

Error in ==> SinaData at 14
s=urlread_General(url2Read);


是不是得装FQuantToolBox啊。请大神们指点
回复 支持 3 反对 0

使用道具 举报

发表于 2015-10-3 18:56:15 | 显示全部楼层
%% SinaYahooDataTest
% by LiYang
% Email:farutoliyang@gmail.com
% 2013/11/26
%% A Little Clean Work
tic;
clear;
clc;
close all;
format compact;
%% 获取历史数据测试

% 历史数据通过Yahoo接口获得 (历史数据为未复权数据,使用时候请注意)
% Yahoo中证券代码为 (上海 .ss 深圳 .sz),例如招商银行,600036.ss

StockName = '600036.ss';
StartDate = today-200;
EndDate = today;
Freq = 'd';
[DataYahoo, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq);

% K线展示
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

Open = DataYahoo(:,2);
High = DataYahoo(:,3);
Low = DataYahoo(:,4);
Close = DataYahoo(:,5);
MT_candle(High,Low,Close,Open,[],Date_datenum);
xlim( [0 length(Open)+1] );
title(StockName);
%% 获取实时数据测试
% Sina中证券代码为 (sh. 上海 sz.深圳),例如招商银行sh600036

StockCode='sh600036';
[DataSina, DataCell]=SinaData(StockCode);
DataCell
%% Record Time
toc;
回复 支持 1 反对 0

使用道具 举报

发表于 2013-11-27 11:13:11 | 显示全部楼层
好东西  顶一个
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 11:21:05 | 显示全部楼层
tmstd 发表于 2013-11-27 11:13
好东西  顶一个

回复 支持 反对

使用道具 举报

发表于 2013-11-27 12:29:29 | 显示全部楼层
好东西啊,和我发的那个股票代码表配合,就可以循环检测所有的股票了。下一步应该再完善一下,做成接口,调用后直接返回个结构体。

评分

参与人数 1贡献 +1 收起 理由
变形金刚4 + 1 速度与激情7 kk321.cc/dongzuo/20473/

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 13:57:38 | 显示全部楼层
blake_libo 发表于 2013-11-27 12:29
好东西啊,和我发的那个股票代码表配合,就可以循环检测所有的股票了。下一步应该再完善一下,做成接口,调 ...

是的,大家一起完善。O(∩_∩)O
回复 支持 反对

使用道具 举报

发表于 2013-11-27 16:00:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-11-27 21:37:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-11-28 09:28:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-28 10:31:39 | 显示全部楼层
感谢大家支持~ O(∩_∩)O
回复 支持 反对

使用道具 举报

发表于 2013-11-28 21:40:25 | 显示全部楼层
看看,以前就想做一个。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-8-6 05:50 , Processed in 0.077263 second(s), 19 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表