楼主: fantuanxiaot
8836 200

[源码分享] [Faruto原创]行情数据频率转换[重采样]通用函数MATLAB实现[by faruto]   [分享]

回帖奖励 39 个论坛币 回复本帖可获得 3 个论坛币奖励! 每人限 5 次

Ψ▄┳一大卫卍卐席尔瓦

大师

9%

还不是VIP/贵宾

-

威望
7
论坛币
-235015 个
通用积分
17.3435
学术水平
3780 点
热心指数
3816 点
信用等级
3451 点
经验
150468 点
帖子
7695
精华
32
在线时间
1324 小时
注册时间
2013-2-3
最后登录
2019-12-11

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

fantuanxiaot 发表于 2015-5-13 18:36:28 |显示全部楼层

让我看看从哪里说起,昨天抽空实现了行情数据频率转换[重采样]通用函数,也算是了了一个小心结,说是“心结”,是因为,频率转换[重采样]函数以前断断续续为了解决一些着急的测试实现过一些小函数,但都不算是一个完美的解决方案,既然叫做行情数据频率转换[重采样] “通用”函数,就要有个通用的样子,这个行情数据频率转换[重采样]通用函数可以实现的功能如下(测试和demo后面再说):


支持证券交易所(上证所、深证所)、期货交易所(中金所、上期所、大商所、郑商所)行情数据频率转换;

支持降采样(downsampling),i.e高频率数据转换为低频率数据:tick数据转换为秒级别数据(任意时间切片)、tick数据转换为分钟级别数据(任意时间切片)、tick数据转换为其他任意更低级别的数据,分钟数据转换为其他任意更低级别的数据(N小时线、N日线等等),日线数据转换为其他任意更低级别的数据(N周线、N月线、N季线、N年线等等);

支持升采样(upsampling),i.e低频率数据通过插值转换高频率数据。

等等等等


这个通函函数我封装成了一个类(DataResampleClass),其属性为函数的参数设置,可以灵活进行相关参数的设置,具体如下:

原文:http://www.matlabsky.com/thread-47209-1-1.html

本帖隐藏的内容

  1. classdef DataResampleClass < handle
  2.     %% DataResampleClass
  3.     % by LiYang_faruto
  4.     % Email:farutoliyang@foxmail.com
  5.     % 2015/6/1
  6.     %% properties
  7.     properties
  8.         % % 降采样还是升采样选择参数
  9.         % 'DownSampling' 'UpSampling'
  10.         DownUpSampling = 'DownSampling';
  11.         % % 采用频率设置参数
  12.         % 'Nmin' 'Nhour' 'Nday' 'Nsecond' 'Nmillisecond'
  13.         % 'Nweek' 'Nmonth' 'Nquarter' 'Nyear' ...
  14.         Fre = '1min';
  15.         % % 数据市场代码设置参数(不同市场交易时间不同)
  16.         % 'SHSZ' 'CFFEX' ...
  17.         Market = 'SHSZ';
  18.         % % 用于产生采样值的方法
  19.         % 'OHLC2OHLC' 'OHLCVA2OHLCVA'
  20.         % 'OHLCVA' 'OHLC'
  21.         % 'first' 'last' 'median' 'max' 'min' 'sum' 'prod'
  22.         HowMethod = 'OHLCVA';
  23.         % % 数据缺失时的插值方法以及升采样时的插值方法选择
  24.         % 'ffill' 'bfill' 'nan'
  25.         FillMethod = 'ffill';
  26.         % % 在降采样中,各时间段的哪一端是闭合(即包含)的
  27.         % 'right' 'left'
  28.         Closed = 'right';
  29.         % % 在降采样中,如何设置采样后的标签,
  30.         % 比如 9:30到9:35之间的这5分钟会被标记为9:30('left')或9:35('right')
  31.         % 'right' 'left'
  32.         Label = 'right';
  33.         % % 输入数据的时间轴的数据格式
  34.         % Datenum: MATALB的datenum格式,
  35.         % DateNumber = datenum(2015,5,13,9,30,33)
  36.         % datestr(DateNumber) = '13-May-2015 09:30:33'
  37.         % PureDouble: 比如201505130930.33
  38.         % 'Datenum' 'PureDouble'
  39.         DateFormatInput = 'PureDouble';
  40.         % % 输入数据的时间轴的数据格式选择
  41.         % 'Datenum' 'PureDouble'
  42.         DateFormatOutput = 'PureDouble';
  43.         
  44.         % 1 0 Resample后是否作图
  45.         isPlot = 0;
  46.         % For LabelSet函数
  47.         LabelSetStyle = 0;
  48.         XTRot = 55;
  49.     end
  50.     %% properties(Access = protected)
  51.     properties(SetAccess = private, GetAccess = public)
  52.         
  53.         DownUpSampling_ParaList = {'DownSampling';'UpSampling';};
  54.         Fre_ParaList = {'Nmin(s)';'Nhour(s)';'Nday(s)';'Nweek(s)';...
  55.             'Nmonth(s);Nquarter(s);Nyear(s);[括号中字符输入不输入都行]'};
  56.         Market_ParaList = {'SHSZ'};
  57.         HowMethod_ParaList = {'OHLC2OHLC';'OHLCVA2OHLCVA'; ...
  58.             'OHLCVA';'OHLC'; ...
  59.             'first';'last';'median';'max';'min';'sum';'prod'};
  60.         
  61.         FillMethod_ParaList = {'ffill';'bfill';'nan'};
  62.         Closed_ParaList = {'right';'left'};
  63.         Label_ParaList = {'right';'left'};
  64.         DateFormat_ParaList = {'Datenum';'PureDouble'};
  65.         
  66. End

  67. … …
  68. … …

  69. end
复制代码



整体功能实现部分参考了Python中Pandas对象的resample方法,函数的实现算是复杂,难点是频率转换时时间轴标签的确定,当下DataResampleClass函数70%的功能我都已经编程实现了,代码行数已经贴近千行了。

具体的一些测试后面马上就给出,这里再多说一句,行情数据频率转换[重采样]通用函数实现之后,未来DataResampleClass函数的最终版会更新添加到FQuantToolBox中,那么有了DataResampleClass函数之后,那么FQuantToolBox对于国内股票期货市场的数据获取和整合就可以说比较全面了,尤其是股票市场,FQuantToolBox已经实现了:


A股市场全市场股票和指数日线数据的获取和动态更新(包括已经退市的股票从上市日至今);

A股市场全市场股票分红配股信息获取和动态更新;

A股市场全市场股票基本面数据获取(3张表、财务数据);

A股市场全市场舆情类数据获取(百度高级搜索函数、新浪高级搜索函数);

A股市场全市场上市公司公告文件获取和动态更新;

A股市场全市场上市公司投资者关系信息文档获取和动态更新;

A股市场全市场股票研报列表和摘要数据获取和动态更新;

A股市场全市场股票每日交易明细数据获取(包括已经退市的股票从2005年至今);

等等等等


有了DataResampleClass函数之后,就可以由每日交易明细数据生成其他常用周期数据(1min、5min、15min、30min、60min等等)。那么基于FQuantToolBox,股票市场的模型测试基本都可以进行了,无论是日线级别测试还是用到分钟线测试(分钟线数据为2005年至今,数据长度应该足够了,太早期的数据参考意义也不大),而且基于FQuantToolBox,这些数据完全都是免费,你还可以进行二次开发,基于FQuantToolBox建立自己的A股市场数据,包括行情数据、包括基本面数据、包括舆情类数据、包括研报数据,进而可以开发和挖掘各式各样的策略,从单纯的价量策略到事件驱动类策略,到文本挖掘类策略,到大数据类策略等等,而且这些完全完全不依赖任何的第三方平台,且全部免费,免费的东西都是大家喜欢的东西。哈哈。



回到这篇的主题,来看一下DataResampleClass函数(类)的测试和demo,DataResampleClass函数过场,我就不贴源码了,函数实现用到的技巧稍微有点多(因为函数核心涉及到好多时间上的处理和检测,所以用到了新版本MATLAB的datetime数据结构还有一些duration、calenderDuration的东西,不过这些也都可以自己实现和封装),可能有些刚接触MATLAB看得会吃力一些。上测试脚本和测试结果。先贴图吧:


[size=14.399999618530273px]单日数据Tick[size=14.399999618530273px]转1min                                                        单日数据Tick5min

单日数据Tick1day单日数据1min5min多日数据Tick1min

多日数据Tick1day多日数据1min5min多日数据1day3day








多日数据1day1week









多日数据1day1month

多日数据1day1quarter























多日数据1day1year




测试数据都用的是FQuantToolBox直接获取,测试了挺多组数据,转换后也和同花顺等行情软件抽样做了对比,没有问题,这里稍微再说一下,日线级别内的频率转换和日线级别外(年、周、月、季等)在转换后的时间轴的确定稍微不一样,有点琐碎,需要认真处理,看官您如果也在弄类似函数需要注意一下。
整体的测试脚本如下:

本帖隐藏的内容



  1. %% DataResampleTestScript
  2. % by LiYang_faruto
  3. % Email:farutoliyang@foxmail.com
  4. % 2015/06/01
  5. %% A Little Clean Work
  6. tic;
  7. % clear;
  8. % clc;
  9. % close all;
  10. format compact;
  11. %% Get Tick Data Using FQuantToolBox

  12. StockCode = 'sz002269';

  13. BeginDate = '20150504';
  14. [StockTick,Header,StatusStr] = GetStockTick_Web(StockCode,BeginDate);
  15. D1 = StockTick;

  16. BeginDate = '20150505';
  17. [StockTick,Header,StatusStr] = GetStockTick_Web(StockCode,BeginDate);
  18. D2 = StockTick;

  19. BeginDate = '20150506';
  20. [StockTick,Header,StatusStr] = GetStockTick_Web(StockCode,BeginDate);
  21. D3 = StockTick;

  22. BeginDate = '20150507';
  23. [StockTick,Header,StatusStr] = GetStockTick_Web(StockCode,BeginDate);
  24. D4 = StockTick;

  25. BeginDate = '20150508';
  26. [StockTick,Header,StatusStr] = GetStockTick_Web(StockCode,BeginDate);
  27. D5 = StockTick;


  28. D = [D1;D2;D3;D4;D5];

  29. % load ResampleTestData.mat

  30. %% DataResampleClass

  31. DResample = DataResampleClass();

  32. %% 参数设置

  33.         % 'DownSampling' 'UpSampling'
  34.         DResample.DownUpSampling = 'DownSampling';
  35.         % '1min' '5min' ...
  36.         DResample.Fre = '1min';
  37.         % 'SHSZ' 'CFFEX' ...
  38.         DResample.Market = 'SHSZ';
  39.         % 'OHLC2OHLC' 'OHLCVA2OHLCVA'
  40.         % 'OHLCVA' 'OHLC'
  41.         % 'first' 'last' 'median' 'max' 'min' 'sum' 'prod'
  42.         DResample.HowMethod = 'OHLCVA';
  43.         
  44.         % 'ffill' 'bfill' 'nan'
  45.         DResample.FillMethod = 'ffill';
  46.         % 'right' 'left'
  47.         DResample.Closed = 'right';
  48.         % 'right' 'left'
  49.         DResample.Label = 'right';
  50.         % 'Datenum' 'PureDouble'
  51.         DResample.DateFormatInput = 'PureDouble';
  52.         % 'Datenum' 'PureDouble'
  53.         DResample.DateFormatOutput = 'PureDouble';
  54.         
  55.         % 1 0 Resample后是否作图
  56.         DResample.isPlot = 1;
  57.         % For LabelSet函数
  58.         DResample.LabelSetStyle = 0;
  59.         DResample.XTRot = 55;

  60.   
  61. %% OneDay tick2min
  62. DResample.Fre = '1min';
  63. DResample.HowMethod = 'OHLCVA';  

  64. InputData1 = D1(:,[1 2 4 5]);

  65. OutputData1 = DResample.Resample(InputData1);
  66. %% OneDay 1minTo5min
  67. DResample.Fre = '5min';
  68. DResample.HowMethod = 'OHLCVA2OHLCVA';

  69. OutputData3 = DResample.Resample(OutputData1);

  70. %% OneDay tick2min

  71. DResample.Fre = '5min';
  72. DResample.HowMethod = 'OHLCVA';  

  73. InputData1 = D1(:,[1 2 4 5]);

  74. OutputData1 = DResample.Resample(InputData1);
  75. %% OneDay tick2day
  76. DResample.Fre = '1day';
  77. DResample.HowMethod = 'OHLCVA';  

  78. InputData1 = D1(:,[1 2 4 5]);

  79. OutputData1 = DResample.Resample(InputData1);


  80. %% MultiDay tick2min

  81. DResample.Fre = '1min';
  82. DResample.HowMethod = 'OHLCVA';  

  83. InputData2 = D(:,[1 2 4 5]);

  84. OutputData2 = DResample.Resample(InputData2);
  85. %% MultiDay 1minTo5min
  86. DResample.Fre = '5min';
  87. DResample.HowMethod = 'OHLCVA2OHLCVA';
  88. OutputData4 = DResample.Resample(OutputData2);
  89. %% MultiDay tick2day
  90. DResample.Fre = '1day';
  91. DResample.HowMethod = 'OHLCVA';  

  92. InputData1 = D(:,[1 2 4 5]);

  93. OutputData1 = DResample.Resample(InputData1);
  94. %% Get Index Data Using FQuantToolBox

  95. StockCode = '000001';
  96. % StockCode = '000300';

  97. BeginDate = '20100101';

  98. EndDate = datestr(today,'yyyy-mm-dd');

  99. [Data] = GetIndexTSDay_Web(StockCode,BeginDate,EndDate);

  100. DateTemp = Data(:,1)*1e4+1500*ones(length(Data),1);
  101. InputData =[DateTemp,Data(:,2:end)];


  102. %% dayToday

  103. DResample.Fre = '3day';
  104. DResample.HowMethod = 'OHLCVA2OHLCVA';  

  105. OutputData1 = DResample.Resample(InputData);

  106. %% dayToweek

  107. DResample.Fre = '1week';
  108. DResample.HowMethod = 'OHLCVA2OHLCVA';  

  109. OutputData1 = DResample.Resample(InputData);


  110. %% dayTomonth

  111. DResample.Fre = '1month';
  112. DResample.HowMethod = 'OHLCVA2OHLCVA';  

  113. OutputData1 = DResample.Resample(InputData);

  114. %% dayToquarter

  115. DResample.Fre = '1quarter';
  116. DResample.HowMethod = 'OHLCVA2OHLCVA';  

  117. OutputData1 = DResample.Resample(InputData);
  118. %% dayToyear

  119. DResample.Fre = '1year';
  120. DResample.HowMethod = 'OHLCVA2OHLCVA';  

  121. OutputData1 = DResample.Resample(InputData);

  122. %%




  123. %% Record Time
  124. toc;
  125. displayEndOfDemoMessage(mfilename);
复制代码



关键词:matlab实现 数据频率转换 MATLAB atlab matla 通用

已有 6 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
niuniuyiwan + 100 + 5 + 5 + 5 精彩帖子
zbin7451f + 100 + 5 + 5 + 5 精彩帖子
lasgpope + 60 + 60 + 5 + 5 + 5 精彩帖子
zsy651012 + 60 + 1 + 1 + 1 精彩帖子
faruto + 5 + 5 + 5 O(∩_∩)O

总评分: 经验 + 420  论坛币 + 60  学术水平 + 22  热心指数 + 22  信用等级 + 22   查看全部评分

本帖被以下文库推荐

stata SPSS
kzpan 发表于 2015-5-13 18:50:21 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:05:01 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:05:37 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:06:20 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:06:56 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:07:29 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

SMACKDOWN 发表于 2015-5-13 19:08:14 |显示全部楼层
回复

使用道具 举报

ydb8848 发表于 2015-5-13 20:07:24 |显示全部楼层

回帖奖励 +3 个论坛币

回复

使用道具 举报

ydb8848 发表于 2015-5-13 20:10:39 |显示全部楼层

回帖奖励 +3 个论坛币

呵呵。。
回复

使用道具 举报

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

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2020-2-18 19:18