通过访问Yahoo和Sina的URL进行股票数据的提取,其中部分函数的实现是基于 郑志勇兄弟( ariszheng @http://www.ariszheng.com/) 的相关函数进行修改优化而成。
这部分东西一直想抽时间弄来着,这段有点犯懒。O(∩_∩)O
历史数据通过YahooData.m函数实现,访问的Yahoo的URL形式为
url2Read=sprintf(...<br />
'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);
可以获取某一股票的日、周、月 的历史数据。</p>
实时数据通过SinaData.m函数实现,访问的Sina的URL形式为
url2Read=['http://hq.sinajs.cn/list=',StockCode];
可以获取某一股票的实时数据,进而再结合timer函数就可以获取某一股票当天的实时行情(这部分懒得弄了)。</p>
测试脚本 SinaYahooDataTest.m
%% SinaYahooDataTest<br />
% by LiYang<br />
% Email:farutoliyang@gmail.com<br />
% 2013/11/26<br />
%% A Little Clean Work<br />
tic;<br />
clear;<br />
clc;<br />
close all;<br />
format compact;<br />
%% 获取历史数据测试</p>
<p>% 历史数据通过Yahoo接口获得 (历史数据为未复权数据,使用时候请注意)<br />
% Yahoo中证券代码为 (上海 .ss 深圳 .sz),例如招商银行,600036.ss</p>
<p>StockName = '600036.ss';<br />
StartDate = today-200;<br />
EndDate = today;<br />
Freq = 'd';<br />
[DataYahoo, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq);</p>
<p>% K线展示<br />
scrsz = get(0,'ScreenSize');<br />
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);</p>
<p>Open = DataYahoo(:,2);<br />
High = DataYahoo(:,3);<br />
Low = DataYahoo(:,4);<br />
Close = DataYahoo(:,5);<br />
MT_candle(High,Low,Close,Open,[],Date_datenum);<br />
xlim( [0 length(Open)+1] );<br />
title(StockName);<br />
%% 获取实时数据测试<br />
% Sina中证券代码为 (sh. 上海 sz.深圳),例如招商银行sh600036</p>
<p>StockCode='sh600036';<br />
[DataSina, DataCell]=SinaData(StockCode);<br />
DataCell<br />
%% Record Time<br />
toc;
运行结果
[attachimg]35585[/attachimg]
DataCell =<br />
'招商银行_sh600036' '股票名称代码'<br />
'2013-11-27' '日期'<br />
'10:28:22' '时间'<br />
[ 10.8400] '今开盘'<br />
[ 10.8300] '昨收盘'<br />
[ 10.7800] '当前价'<br />
[ 10.8500] '今最高'<br />
[ 10.7600] '今最低'<br />
[ 10.7700] '竞买价,即“买一”报价'<br />
[ 10.7800] '竞卖价,即“卖一”报价'<br />
[ 11165602] '成交量,单位“股”'<br />
[ 120618712] '成交额,单位“元”'<br />
[ 17119] '买一量'<br />
[ 10.7700] '买一价'<br />
[ 348053] '买二量'<br />
[ 10.7600] '买二价'<br />
[ 509400] '买三量'<br />
[ 10.7500] '买三价'<br />
[ 129800] '买四量'<br />
[ 10.7400] '买四价'<br />
[ 236600] '买五量'<br />
[ 10.7300] '买五价'<br />
[ 36790] '卖一量'<br />
[ 10.7800] '卖一价'<br />
[ 50257] '卖二量'<br />
[ 10.7900] '卖二价'<br />
[ 158371] '卖三量'<br />
[ 10.8000] '卖三价'<br />
[ 143496] '卖四量'<br />
[ 10.8100] '卖四价'<br />
[ 33665] '卖五量'<br />
[ 10.8200] '卖五价'
YahooData.m函数源码
function [Data, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq)<br />
% by LiYang(faruto) @http://www.matlabsky.com<br />
% 本函数是基于 ariszheng @http://www.ariszheng.com/ 的相关函数进行修改而成<br />
% 用来通过Yahoo获取股票历史数据<br />
% 历史数据通过Yahoo接口获得 (历史数据为未复权数据,使用时候请注意)<br />
%% 输入参数<br />
% StockName 证券代码(上海 .ss 深圳 .sz)<br />
% StartDate, EndDate 时间段的开始日与结束日<br />
% Freq 频率<br />
%% 测试函数<br />
% StockName = '600036.ss';<br />
% StartDate = today-200;<br />
% EndDate = today;<br />
% Freq = 'd';<br />
% [DataYahoo, Date_datenum, Head]=YahooData(StockName, StartDate, EndDate, Freq);</p>
<p>%% 数据时间区间<br />
startdate=StartDate;<br />
enddate=EndDate;<br />
%字符串变化<br />
ms=num2str(str2double(datestr(startdate, 'mm'))-1);<br />
ds=datestr(startdate, 'dd');<br />
ys=datestr(startdate, 'yyyy');<br />
me=num2str(str2double(datestr(enddate, 'mm'))-1);<br />
de=datestr(enddate, 'dd');<br />
ye=datestr(enddate, 'yyyy');</p>
<p>% s: 股票代码 (e.g. 002036.SZ 300072.SZ 600036.SS 等)<br />
% c-a-b: 起始日期年、月、日 (月份的起始索引为0) 2010-5-11 = 2010年6月11日<br />
% f-d-e: 结束日期年、月、日 (月份的起始索引为0) 2010-7-23 = 2010年8月23日<br />
% g: 时间周期。d=每日,w=每周,m=每月,v=只返回除权数据<br />
% 省略所有参数,只制定股票代码时,返回所有历史数据<br />
url2Read=sprintf(...<br />
'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);</p>
<p>s=urlread_General(url2Read);</p>
<p>Head = ['Date Open High Low Close Volume AdjClose'];<br />
Result=textscan(s, '%s %s %s %s %s %s %s', 'delimiter', ',');</p>
<p>temp = Result{1,1};<br />
Date_datestr = temp(2:end);<br />
Date_datestr = Date_datestr(end:(-1):1);</p>
<p>temp = Result{1,2};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
Open = temp;</p>
<p>temp = Result{1,3};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
High = temp;</p>
<p>temp = Result{1,4};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
Low = temp;</p>
<p>temp = Result{1,5};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
Close = temp;</p>
<p>temp = Result{1,6};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
Volume = temp;</p>
<p>temp = Result{1,7};<br />
temp = cellfun(@str2double, temp(2:end));<br />
temp = temp(end:(-1):1);<br />
AdjClose = temp;</p>
<p>Date_datenum = datenum(Date_datestr);<br />
Date_double = str2num( datestr(Date_datenum, 'yyyymmdd') );</p>
<p>Data = [Date_double, Open, High, Low, Close, Volume, AdjClose];</p>
<p>end
</p>
SinaData.m函数源码
function [Data, DataCell]=SinaData(StockCode)<br />
% by LiYang(faruto) @http://www.matlabsky.com<br />
% 本函数是基于 ariszheng @http://www.ariszheng.com/ 的相关函数进行修改而成<br />
% 用来通过sina获取股票实时数据<br />
%% 输入参数<br />
% StockCode 证券代码(上海sh+code 深圳 sz+code)<br />
%% 测试函数<br />
%提取数据 招商银行(上海交易所)<br />
% StockCode='sh600036';<br />
% [Data, DataCell]=SinaData(StockCode);</p>
<p>%% Sina URL<br />
url2Read=['http://hq.sinajs.cn/list=',StockCode];<br />
s=urlread_General(url2Read);</p>
<p>result=textscan(s,'%s','delimiter', ',');</p>
<p>result = result{1,1};<br />
DataCell = result;<br />
Data = cellfun(@str2double, DataCell(2:30));</p>
<p>temp = cell2mat(DataCell(1));<br />
StockName = temp(22:end);<br />
StockID = temp(12:19);</p>
<p>DataCell{1, 1} = [StockName, '_', StockID];</p>
<p>StockDate = cell2mat( DataCell(31) );<br />
StockTime = cell2mat( DataCell(32) );</p>
<p>DataCell{2, 1} = StockDate;<br />
DataCell{3, 1} = StockTime;</p>
<p>DataCell(4:end-1) = mat2cell( Data, ones(length(Data), 1) );</p>
<p>temp = DataCell(1:32);<br />
DataCell = temp;</p>
<p>ind = 1;<br />
DataCell{ind, 2} = '股票名称代码';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '日期';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '时间';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '今开盘';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '昨收盘';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '当前价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '今最高';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '今最低';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '竞买价,即“买一”报价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '竞卖价,即“卖一”报价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '成交量,单位“股”';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '成交额,单位“元”';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买一量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买一价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买二量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买二价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买三量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买三价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买四量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买四价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买五量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '买五价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖一量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖一价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖二量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖二价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖三量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖三价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖四量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖四价';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖五量';<br />
ind = ind + 1;<br />
DataCell{ind, 2} = '卖五价';</p>
<p>end
</p>
其中YahooData.m和SinaData.m函数会用到一个 urlread_General.m 读取网页的函数,是重新封装的,matlab的老版本的urlread再读取中文网页时会有乱码,所以这里做了一些处理。
整理所有函数源码打包下载。
Matlab通过Yahoo与Sina获取历史与实时股票数据[faruto版本]
http://www.matlabsky.com/thread-38988-1-1.html