正文
本篇来自我的微信公众号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