专栏名称: FQuantStudio
聊量化投资研究、聊MATLAB应用、聊投资理财-…
目录
相关文章推荐
中国金融四十人论坛  ·  刘守英:顺应城乡融合,变革土地制度 ·  18 小时前  
金融早实习  ·  国金证券2025届春季校园招聘启动! ·  22 小时前  
国际金融报  ·  围猎英特尔 ·  3 天前  
哲学王  ·  三联的猛料,刺痛了多少中国人! ·  4 天前  
51好读  ›  专栏  ›  FQuantStudio

行情数据频率转换[重采样]通用函数MATLAB实现【faruto出品】

FQuantStudio  · 知乎专栏  ·  · 2015-07-20 22:06

正文

本篇来自我的微信公众号FQuantStudio以前的一篇文章

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


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

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

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

等等等等


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

classdef DataResampleClass < handle
  %% DataResampleClass
   %by LiYang_faruto
   %Email:[email protected]
   %2015/6/1
  %% properties
  properties
      % % 降采样还是升采样选择参数
      % 'DownSampling' 'UpSampling'
      DownUpSampling = 'DownSampling';
      % % 采用频率设置参数
      % 'Nmin' 'Nhour' 'Nday' 'Nsecond' 'Nmillisecond'
      % 'Nweek' 'Nmonth' 'Nquarter' 'Nyear' ...
      Fre = '1min';
      % % 数据市场代码设置参数(不同市场交易时间不同)
      % 'SHSZ' 'CFFEX' ...
      Market = 'SHSZ';
      % % 用于产生采样值的方法
      % 'OHLC2OHLC' 'OHLCVA2OHLCVA'
      % 'OHLCVA' 'OHLC'
      % 'first' 'last' 'median' 'max' 'min' 'sum' 'prod'
      HowMethod = 'OHLCVA';
      % % 数据缺失时的插值方法以及升采样时的插值方法选择
      % 'ffill' 'bfill' 'nan'
      FillMethod = 'ffill';
      % % 在降采样中,各时间段的哪一端是闭合(即包含)的
      % 'right' 'left'
      Closed = 'right';
      % % 在降采样中,如何设置采样后的标签,
      % 比如 9:30到9:35之间的这5分钟会被标记为9:30('left')或9:35('right')
      % 'right' 'left'
      Label = 'right';
      % % 输入数据的时间轴的数据格式
      % Datenum: MATALB的datenum格式,
      % DateNumber = datenum(2015,5,13,9,30,33)
      % datestr(DateNumber) = '13-May-2015 09:30:33'
      % PureDouble: 比如201505130930.33
      % 'Datenum' 'PureDouble'
      DateFormatInput = 'PureDouble';
      % % 输入数据的时间轴的数据格式选择
      % 'Datenum' 'PureDouble'
      DateFormatOutput = 'PureDouble';
     
      % 1 0 Resample后是否作图
      isPlot = 0;
      % For LabelSet函数
      LabelSetStyle = 0;
      XTRot = 55;
  end
  %% properties(Access = protected)
  properties(SetAccess = private, GetAccess = public)
     
      DownUpSampling_ParaList = {'DownSampling';'UpSampling';};
      Fre_ParaList = {'Nmin(s)';'Nhour(s)';'Nday(s)';'Nweek(s)';...
          'Nmonth(s);Nquarter(s);Nyear(s);[括号中字符输入不输入都行]'};
      Market_ParaList = {'SHSZ'};
      HowMethod_ParaList = {'OHLC2OHLC';'OHLCVA2OHLCVA'; ...
          'OHLCVA';'OHLC'; ...
          'first';'last';'median';'max';'min';'sum';'prod'};
     
      FillMethod_ParaList = {'ffill';'bfill';'nan'};
      Closed_ParaList = {'right';'left'};
      Label_ParaList = {'right';'left'};
      DateFormat_ParaList = {'Datenum';'PureDouble'};
     
End

… …
… …

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的朋友看得会吃力一些。上测试脚本和测试结果。先贴图吧:

单日数据Tick转1min

单日数据Tick转5min

单日数据Tick转1day

单日数据1min转5min

多日数据Tick转1min

多日数据Tick转1day

多日数据1min转5min

多日数据1day转3day

多日数据1day转1week

多日数据1day转1month

多日数据1day转1quarter







请到「今天看啥」查看全文