欢迎访问一起赢论文辅导网
本站动态
联系我们
 
 
 
 
 
 
 
 
 
 
 
QQ:3949358033

工作时间:9:00-24:00
计算机论文
当前位置:首页 > 计算机论文
基于MATLAB的量化数据回测工具箱
来源:一起赢论文网     日期:2014-12-16     浏览数:3793     【 字体:

 1.         FQuantToolBox是做什么用的?
FQuantToolBox定位是个数据和回测工具箱,没有实盘交易相关接口的实现(但未来不排除增加相关功能)。
数据方面,FQuantToolBox数据获取函数完全基于网络的免费数据源(主要为新浪财经、雅虎财经等金融网站),不但可以积累历史数据,也可以进行动态更新,现已实现的数据获取为A股市场的全部股票名称和对应代码(包含已退市股票)、A股市场的股票日线除权数据以及复权因子、A股市场的股票的除权除息信息、A股市场的股票每日交易明细数据(Tick数据)、A股市场的的股票财务指标数据、A股市场的股票的三张表(资产负债表、现金流量表、利润表)数据,未来数据方面会增加更多的数据,包括期货数据以及其他金融标的的数据,整体的思想还是完全基于网络获取和更新,完全免费。
         基于网络的数据获取的实现方式大体过程就是网络数据网址寻找——> 网址分析——> urlread+正则表达式数据提取。进行网络数据的抓取,正则表达式是一定会遇到的,MATLAB中有相应的正则表达式函数,有关正则表达式的东西这里不做展开,各位看官需要自行做些功课,FQuantToolBox工具箱的Doc文件夹内有个我重新整理过的《MATALB正则表达式零基础起步教程.doc》文档,可以帮助您学习正则表达式相关的东西。
回测方面,FQuantToolBox工具箱当下提供了一个“如何构建基于MATLAB的回测系统”的demo样例,此部分内容来自我出版的《量化投资:以MATLAB为工具》的相关章节,未来回测方面会增添更多的辅助函数和插件,方便您使用MATLAB进行股票以及期货相关策略的回测。
         未来FQuantToolBox工具箱每次发布都会提供两个版本,无历史数据版本和有历史数据版本。无历史数据版本仅提供相关函数,你可以在自己本地运行相关脚本来批量获取历史数据;有历史数据版本不但提供相关函数,还提供已经获取好的历史数据(A股市场全部股票股票名称和代码、日线数据、每日交易明细数据、除权除息信息、财务指标数据、三张变数据),节省您获取历史数据的时间,但相应的下载文件也会比较大(尤其股票每日交易明细数据),新的数据更新只需运行相应脚本函数就可以进行全市场最新数据的更新。
 

2.         FQuantToolBox工具箱内容简介

FQuantToolBox工具箱内容截图:

1.jpg


其中
上面截图中的一些函数文件就是用来实现获取数据、批量保存数据至本地.mat文件、前后复权数据计算、K线图展示、回测等功能的。各个子文件夹存放的内容如下:
DataBase文件夹,主要用来存贮批量下载的历史数据。
Doc文件夹,主要用来存放一些简历教程和资料,比如我重新整理过的《MATALB正则表达式零基础起步教程.doc》文档,就存放在Doc文件夹内。
MatlabGame文件夹,主要存放一些基于MATLAB的游戏,用来休闲娱乐,现在主要有俄罗斯方块(mtetris.m)、贪吃蛇(snake.m)、数独(sudokue.m)。
ToolBox文件夹,主要存放一些其他常用的工具箱,主要有:

 

2.jpg

 

 

Utilities文件夹,主要存放一些常用工具函数和辅助函数。
<如何构建基于MATLAB的回测系统>文件夹,提供了一个“如何构建基于MATLAB的回测系统”的demo样例,此部分内容来自我出版的《量化投资:以MATLAB为工具》的相关章节。
下面来介绍一下相关的函数和测试样例。

3.        行情数据和基本面数据获取函数

 

    (1)     获取A股市场的全部股票名称和对应代码(包含已退市股票)


函数名称:GetStockList_Web.m
函数作用:获取A股市场的全部股票名称和对应代码(包含已退市股票)
函数句柄:[StockList,StockListFull] =GetStockList_Web
函数说明:从http://quote.eastmoney.com/stocklist.html抓取最新的股票名称和代码列表,返回的StockList为股票名称和对应的代码
测试样例:

  1. %% 获取股票代码列表测试
  2. [StockList,StockListFull] =GetStockList_Web;
  3. StockCodeDouble = cell2mat(StockList(:,3) );
  4. save('StockList','StockList');
复制代码

运行结果:
StockList:

3.jpg

 

 

 

(2)     获取A股市场的股票日线除权数据以及复权因子
获取单只股票的日线数据
函数名称:GetStockTSDay_Web.m
函数作用:获取单只股票的日线数据除权数据以及复权因子(包含已退市股票)
函数句柄:[StockDataDouble,adjfactor] =GetStockTSDay_Web(StockCode,BeginDate,EndDate)
函数说明:从
http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_FuQuanMarketHistory/stockid/000562.phtml?year=2014&jidu=4
抓取相应股票的后复权数据和复权因子,然后反推算出最新的除权价格。
返回的StockDataDouble为股票除权后的日线数据,其每列的含义为:
日期开 高 低 收 量(股) 额(元) 复权因子

有关股票日线数据的获取,我也尝试了许多数据网址,最终决定从这个链接抓的理由是:可获取所有的A股的从上市至今的日线数据(包含已退市股票)且数据质量不错,其他的链接要么可获取的日线的历史长度太短,要么数据质量不好,从上面这个链接抓数据还有一个好处就是可以直接得到复权因子,进而可以直接根据复权因子进行前后复权数据的生成,非常省事,尽管我们可以抓取股票分红配股的信息(下面有函数获取股票的除权除息信息数据),然后再自己计算复权因子,进而计算前后复权数据。
有关复权因子的定义,以及前后复权数据的计算方法,这里不做展开,您需要自己做些功课,只有亲自研究过、coding过,您才会发现,一个简单的前后复权弄彻底搞清楚并实现并不是特别简单。
这里要说明的是一般股票的回测,之所以要计算和生成前复权数据(后面有相应函数实现),是因为在股票的回测中,我们一般会使用前复权的数据进行回测,而非除权后的数据,因为除权后的数据由于分红配股的影响数据有缺口不够连续,会影响相应指标的计算。
测试样例:

  1. %% 参数设置
  2. StockCode_G = '000562'
  3.  
  4. str = ['全局参数设置完毕!'];
  5. disp(str);
  6. %% 获取股票日线(除权除息)数据测试
  7. StockCode = StockCode_G;
  8.  
  9. BeginDate = '20140101';
  10. EndDate = '20150101';
  11.  
  12. [StockDataDouble,adjfactor] = GetStockTSDay_Web(StockCode,BeginDate,EndDate);
复制代码

运行结果:
StockDataDouble:

4.jpg

 

 

 

批量获取股票除权日线数据并存贮至本地.mat数据
函数名称:SaveStockTSDay.m
函数作用:批量获取股票除权日线数据并存贮至本地.mat数据(包含已退市股票)
函数句柄:[SaveLog,ProbList,NewList]= SaveStockTSDay(StockList,AdjFlag,XRDFlag)
函数说明:基于GetStockTSDay_Web函数,批量获取StockList指定的代码列表的日线数据并存贮至工具箱下的DataBase\Stock\Day_ExDividend_mat文件夹内,首次获取全市场所有的股票数据会比较费时,若已经有历史数据,运行SaveStockTSDay会进行本地数据的更新至最新交易日数据。
测试样例:

  1. %% 获取股票代码列表测试
  2. [StockList,StockListFull] = GetStockList_Web;
  3. StockCodeDouble = cell2mat( StockList(:,3) );
  4. save('StockList','StockList');
  5. %% 股票数据更新-除权除息数据-无并行操作
  6. AdjFlag = 0;
  7. XRDFlag = 0;
  8. [SaveLog,ProbList,NewList] =SaveStockTSDay(StockList,AdjFlag,XRDFlag);
复制代码

运行结果:
首次运行后就会在本地DataBase\Stock\Day_ExDividend_mat保存全部A股市场的除权数据:

5.jpg

 

 

(3)     获取股票交易明细数据

获取单只股票某日交易明细数据
函数名称:GetStockTick_Web.m
函数作用:获取单只股票某日交易明细数据
函数句柄:[StockTick,Header,StatusStr]= GetStockTick_Web(StockCode,BeginDate,SaveFlag)函数说明:从
http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php?symbol=sz000562&date=2014-12-05
抓取单只股票某日交易明细数据,返回的StockTick为股票交易明细数据,每列的含义为:
成交时间成交价 价格变动 成交量(手) 成交额(元) 性质(买盘:1,卖盘:-1,中性盘:0)
测试样例:

  1. %% 参数设置
  2. StockCode_G = '000562'
  3.  
  4. str = ['全局参数设置完毕!'];
  5. disp(str);
  6. %% 获取股票某日交易明细
  7. StockCode = StockCode_G;
  8.  
  9. BeginDate = '20141205';
  10. [StockTick,Header,StatusStr] =GetStockTick_Web(StockCode,BeginDate);
复制代码

运行结果:
StockTick:

6.jpg

 

 

 

批量获取股票每日交易明细数据并存贮至本地.mat数据
函数名称:SaveStockTick.m
函数作用:批量获取股票每日交易明细数据并存贮至本地.mat数据
函数句柄:[SaveLog,ProbList,NewList] = SaveStockTick(StockList,DateList,PList,CheckFlag)
函数说明:基于GetStockTick_Web函数,批量获取StockList和DateList指定的代码列表、日期列表的交易明细数据并存贮至工具箱下的DataBase\Stock\Tick_mat文件夹内,首次获取全市场所有的股票数据会非常费时,若已经有历史数据,运行SaveStockTick会进行本地数据的更新至最新交易日数据。
测试样例:

 

  1. %% 获取股票代码列表测试
  2. [StockList,StockListFull] =GetStockList_Web;
  3. StockCodeDouble = cell2mat( StockList(:,3));
  4. save('StockList','StockList');
  5. %% 获取交易明细数据Tick-无并行操作
  6. [SaveLog,ProbList,NewList] =SaveStockTick(StockList);
复制代码

运行结果:
首次运行后就会在本地DataBase\Stock\Tick_mat保存全部A股市场的交易明细数据,每个股票一个文件夹。

7.jpg


8.jpg

 

(4)     获取股票分红配股信息数据

函数名称:GetStockList_Web.m
函数作用:获取股票分红配股信息数据
函数句柄:
[ Web_XRD_Data , Web_XRD_Cell_1 , Web_XRD_Cell_2] = GetStockXRD_Web(StockCode)
函数说明:从
http://vip.stock.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/000562.phtml
抓取最新的股票名称和代码列表,返回的Web_XRD_Data , Web_XRD_Cell_1 , Web_XRD_Cell_2为股票的分红配股信息数据。
此函数是在Chandeman层编写过的一个函数基础修改而成。
测试样例:

  1. %% 参数设置
  2. StockCode_G = '000562'
  3.  
  4. str = ['全局参数设置完毕!'];
  5. disp(str);
  6. %% 获取股票除权除息数据
  7. StockCodeInput = StockCode_G;
  8.  
  9. [ Web_XRD_Data , Web_XRD_Cell_1 ,Web_XRD_Cell_2 ] = GetStockXRD_Web(StockCodeInput);
  10. Web_XRD_Cell_1;
  11. Web_XRD_Cell_2;
复制代码

运行结果:

9.jpg

 

 

10.jpg

 

 

相应的批量数据获取和保存函数为

[SaveLog,ProbList,NewList] =SaveStockTSDay(StockList,AdjFlag,XRDFlag)

此时需令XRDFlag = 1即可批量获取获取除权除息信息。

首次运行后就会在本地DataBase\Stock\XRDdata_mat保存全部A股的除权除息信息数据:

11.jpg

 

 

 

(5)     财务数据和三张表数据获取
GetStockFinIndicators_Web.m函数和GetStock3Sheet_Web.m函数可以获取单只股票的财务数据和三张表数据
[FIndCell,YearList] = GetStockFinIndicators_Web(StockCode,Year)
[BalanceSheet,ProfitSheet,CashFlowSheet,YearList]= GetStock3Sheet_Web(StockCode,Year)

数据获取后用cell矩阵承装

12.jpg

 

 

13.jpg

 

 

相应的批量数据获取函数为

[SaveLog,ProbList,NewList] =SaveStockFD(StockList,Opt)

% Opt 0:获取财务指标 1:获取3张表

财务数据存贮位置:

FQuantToolBox\DataBase\Stock\FinancialIndicators_mat

14.jpg

 

 

三张表数据存贮位置:

FQuantToolBox\DataBase\Stock\Sheet3_mat

15.jpg

 

 

(6)     其他函数
CalculateStockXRD.m由除权数据生成前后复权数据
测试样例:

  1. %% 参数设置
  2. StockCode_G = '000562'
  3.  
  4. str = ['全局参数设置完毕!'];
  5. disp(str);
  6. %% 获取股票日线(除权除息)数据测试
  7. StockCode = StockCode_G;
  8.  
  9. BeginDate = '20140101';
  10. EndDate = '20150101';
  11.  
  12. [StockDataDouble,adjfactor] =GetStockTSDay_Web(StockCode,BeginDate,EndDate);
  13. %% 进行前复权数据生成
  14.  
  15. StockData = StockDataDouble(:,1:end);
  16. XRD_Data = [];
  17. AdjFlag = 1;
  18. [StockDataXRD, factor] =CalculateStockXRD(StockData, XRD_Data, AdjFlag);
  19. %% 复权价格plot
  20. scrsz = get(0,'ScreenSize');
  21. figure('Position',[scrsz(3)*1/4scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);
  22.  
  23. AX1 = subplot(211);
  24. OHLC = StockDataDouble(:,2:5);
  25. KplotNew(OHLC);
  26. Dates = StockDataDouble(:,1);
  27. LabelSet(gca, Dates, [], [], 1);
  28. ind = find( StockCodeDouble ==str2double(StockCode) );
  29. str =[StockList{ind,1},'-',StockList{ind,2},'除权价格'];
  30. title(str,'FontWeight','Bold');
  31.  
  32. AX2 = subplot(212);
  33. OHLC = StockDataXRD(:,2:5);
  34. KplotNew(OHLC);
  35. Dates = StockDataDouble(:,1);
  36. LabelSet(gca, Dates, [], [], 1);
  37. ind = find( StockCodeDouble ==str2double(StockCode) );
  38. str =[StockList{ind,1},'-',StockList{ind,2},'前复权价格'];
  39. title(str,'FontWeight','Bold');
  40.  
  41. linkaxes([AX1, AX2], 'x');
复制代码

16.jpg

2014-12-14 23:14:19 上传
下载附件 (61.84 KB)
 

 

 

 

[返回]
上一篇:用Python从四大期货交易所爬取数据
下一篇:计算机应用研究论文退修问题