点宽客的成长日记【Day 4 演练一下吧 - 先试试数据的操作】
发布时间:2019/09/16 03:29:43 1475 0
前面两天我们已经学习了MATLAB的基本语法了,也基本了解了**AT**的运行环境,但是**学海无涯,实操见真**,今天我们就来实际操练一下,先从数据开始吧! AT内置全套的基于股票、期货等的数据操作,策略运行的函数,其特点是均以`trader`开头。下面我们分类来讲解,并尝试运用这些函数。 ###一、数据获取函数 AT内置常用的有12个数据获取的函数,具体如下 - 常规类(可直接调取数据,无需回测) `traderGetCodeList`:获得指数、行业板块、地域板块、期权板块的包括成分股及权重等信息 `traderGetKData`:根据起止时间点提取K线数据;可通过此函数获取该时段内重要的价量数据 `traderGetRtDataMulti`:获取多组股票或期货实时报价,品种类型需保持一致,全为股票或全为期货 `traderGetTradingTime`:获取某个标的的交易时间(分钟、秒为单位) - 回测类(Only support in BackTest, RealTrade and Replay) `traderGetCurrentBarV2`:获得当前bar的信息 `traderGetCurrentTick `:获取当前的tick的所有信息 `traderGetTickDataV2`:提取某一时间段的Tick数据 `traderGetFutureInfoV2`:获取期货信息 - 策略内函数(含`Reg`,需先注册数据) `traderGetRegKData`:根据已注册的数据序列获取K线数据;可通过此函数获取该时段内重要的价量数据 `traderGetRegTimeLine`:获取注册数据的时间序列 `traderGetRegUserData`:根据已注册的用户自行导入的外部数据获取K线数据;可通过此函数获取该时段内重要的价量数据 `traderGetRegUserIndi`:根据已注册的用户自建因子序列获取数据索引序列 通常,只有**常规类**可以直接调用,无需回测即可对数据操作。下面我们分别对这四个函数进行实践操作。 #####1. traderGetCodeList - 函数说明: 获得指数(包含权重和成分股)、行业板块(没有权重,只有成分股)、地域板块(没有权重,只有成分股)、期权板块的信息(包含成分股及权重) - 语法格式:`IDPWeightArray = traderGetCodeList(block,varargin)` - 输入参数:`block`: 板块或指数的名称,字符串格式;`varargin`: 输入的时间,数字格式(年月日,8位),缺省时默认为当前时间 - 输出参数:`IDPWeightArray`包含5个字段: `Market`-市场;`Code`-代码;`Name`-板块或指数的详细名称;`BlockName`-输入的板块或指数名称;`Weight`-权重 - 示例: 1)获取某个交易所的所有品种/合约 ```matlab IDPWeightArray = traderGetCodeList('SHFE') %上海期货当前的所有合约类型 ``` 查看`IDPWeightArray`结构体,包含有五个元素 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/103442iwrcqremcml344qz.png) **注:输入股票、期货交易所代码可以看到该交易所某一日期下所有品种/合约类型** 2)获取具体指数成分: ```matlab >>IDPWeightArray=traderGetCodeList('HS300',20180101) %沪深300的2018年1月1日的成分股及权重 ``` 查看`IDPWeightArray`结构体,包含有五个元素 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/095959sqq22qusyl9e2lrv.png) #####2. traderGetKData - 函数说明: 根据起止时间点提取K线数据;可通过此函数获取该时段内重要的价量数据。 - 语法格式: `[time,open,high,low,close,volume,turnover,openinterest]=traderGetKData(Market,Code,KFrequency,KFreNum,BeginDate,EndDate,FilledUp,FQ)` - 输入参数: `Market`-市场类型,字符串格式,包含:`'SZSE'`深交所股票;`'SSE'`上交所股票;`'SHFE'`上海期货;`'DCE'`大连商品期货;`'CZCE'`郑州商品期货;`'CFFEX'`中金所 `Code`:交易品种代码,字符串格式,如‘000002’ `KFrequency`:K线的时间级别,如min , day `KFreNum`:K线的频率 `BeginDate`:开始日期,整型,如20140608 `EndDate`:结束日期,整型,如20140609,为0时取到当天 `FilledUp`:补齐类型,包含`false`或者`true`, false表示不补齐,true为补齐 `FQ`:复权类型,包含`'NA'`不复权,`'FWard'`向前复权,`'BWard'`向后复权 - 输出参数:8类数据,均为 N×1 double型数组 `time`:时间列表,以Matlab日期数字形式存储,每个元素对应time中时间点。 `open`:开盘价数据 `high`:最高价数据 `low`:最低价数据 `close`:收盘价数据 `volume`:成交量数据 `turnover`:成交金额 `openinterest`:持仓量数据 - 示例: ```matlab [Data.time,Data.open,Data.high,Data.low,Data.close,Data.volume,Data.turnover,Data.openinterest]=traderGetKData('SZSE', '000001', 'day', 1, 20100101, 20171231,false, 'FWard'); %获取2010年到2017年平安银行的不补齐的向前复权的K线数据,存在Data结构体内 ``` 为了查看获取到的数据,取日收盘价、最高价、最低价做图如下 ```matlab plot(datenum(datestr(Data.time)),Data.close,'b'); %函数输出matlab时间格式,需用datestr转成日期字符串;为画图,再用datanum转成数字输出 hold on; plot(datenum(datestr(Data.time)),Data.low,'g') hold on; plot(datenum(datestr(Data.time)),Data.high,'r') title('000001') legend('closeprice','lowprice','highprice') dateaxis('x',1) %设定横轴为日期格式显示 ``` ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/114622jmkqqxkgx0j3jjql.png) #####3. traderGetRtDataMulti - 函数说明:获取多组股票或期货实时报价,品种类型需保持一致,全为股票或全为期货 - 语法格式:`RtDataList = traderGetRtDataMulti(IDList)` - 输入参数: `IDList`:编码结构体数组,其元素包含:`Market` -市场类型,字符串格式,允许值与上述函数相同;`Code`:交易品种代码,字符串格式,如‘000002’; - 输出参数: `RtDataList`:实时数据结构体,其元素包含:`'Market'`-市场;`'Time'`- 时间;`'Code'`- 代码;`'CurrentPrice'`-当前价;`'CurrentQuantity'`- 当前成交量 - 示例: 获得3支期货合约的实时报价数据 ```matlab FuturesList(1).Market='CFFEX'; FuturesList(1).Code='IF0000'; FuturesList(2).Market='shfe'; FuturesList(2).Code='ag0000'; FuturesList(3).Market='shfe'; FuturesList(3).Code='al0000'; RtData = traderGetRtDataMulti(FuturesList); ``` 输出得到的RtData为1x3的结构体数组,其元素为 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/145903wm19ux8kxxnklxsi.png) #####4. traderGetTradingTime - 函数说明:获取交易时间,针对特定标的。 - 语法格式:` [Time,DayPos]=traderGetTradingTime(TargetList,freq,BeginDay,EndDay)` - 输入参数: `TargetList`:策略标的列表,为结构体类型,其元素包括:`Market` -市场类型,字符串格式,允许值与上述函数相同;`Code`-交易品种代码,字符串格式,如‘000002’ `Market`:市场类型,字符串格式 `Code`:交易品种代码,字符串格式,如‘000002’ `freq`:返回的时间精细级别,如sec,min `BeginDay`:开始日期,整型,如20170216 `EndDay`:结束日期,整型,如20170222 - 输出参数: `Time`:时间,MATLAB时间格式。 `DayPos`:该时间在所属日期的bar序列数。 ```matlab %调用前需先规定标的所在市场和代码 targetlist.Market='SSE'; targetlist.Code='600009'; %获取2017年2月16日到2017年2月17日之间的分钟交易时间 [Time,DayPos]= traderGetTradingTime (targetlist, 'min', 20170216, 20170217) ``` **注意:此处输出的time为MATLAB内置时间格式,若要转成常见的时间格式,需调用函数datestr**。 对于其他回测类函数或策略内函数,不能直接调用,读者可以通过在命令行输入`help 函数名`来查看具体用法。我们在之后学习策略时也会进一步使用这些函数。 ###二、示例:时间序列分析 基于上述数据获取函数,我们对得到的数据进行时间序列分析,下面以股票序列为例。 ####1. 获取原始股票序列并进行差分 打开 [AutoTrader](https://www.digquant.com.cn/at "AutoTrader") 软件,在左上角点击Matlab按钮打开Matlab。利用`traderGetKData`函数获取平安银行(代码000001)股票从2008年1月1日到2018年1月1日间10年的收盘价序列。由于原始序列波动性大,所以我们对序列进行一阶差分来做平稳化处理。差分公式为 ```latex diff(X_i)=X_{i+1}-X_i ``` 具体代码如下: ```matlab %获取股票序列,输出8个序列数据 [Data.time,Data.open,Data.high,Data.low,Data.close,Data.volume,Data.turnover,Data.openinterest]=traderGetKData('SZSE', '000001', 'day', 1, 20080101, 20180101,false, 'FWard'); %对收盘价进行一阶、二阶差分,以进行平稳化处理 Data.diffcloseprice1=diff(Data.close); %一阶差分 Data.diffcloseprice2=diff(diff(Data.close)); %二阶差分 Data.difftime1=Data.time(2:length(Data.time)); Data.difftime2=Data.time(2:length(Data.time)-1); %注意,由于差分后价格序列长度减1(或减2),对应时间也要减1(减2) %画图呈现差分后序列 plot(datenum(datestr(Data.difftime1)),Data.diffcloseprice1,'r'); hold on; plot(datenum(datestr(Data.difftime2)),Data.diffcloseprice2,'b'); dateaxis('x',1) legend('closeprice - 1st order diff','closeprice - 2nd order diff') title('000001平安银行差分后序列') ``` ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/173959h6amodw75bec2ea9.jpg) ####2. 平稳性检验 为了更量化地检验差分序列的平稳性,我们使用`adftest`函数进行检验。 ```matlab [h,pValue,stat,cValue,reg] = adftest(Data.diffcloseprice1) %检验平稳性 [h,pValue,stat,cValue,reg] = adftest(Data.diffcloseprice2) ``` 得到结果为 ```matlab h1 = logical 1 pValue1 = 1.0000e-03 stat1 = -47.9576 cValue1 = -1.9416 h2 = logical 1 pValue2 = 1.0000e-03 stat2 = -81.5105 cValue2 = -1.9416 ``` 由`h1 = h2 = 1`得出,一阶、二阶差分是平稳(逻辑输出为0则不平稳)。而由`p1=p2=0.001`发现一、二阶差分并无明显区别,基于操作复杂度,我们选择一阶差分结果。 ####3. ARMA模型拟合 对于上述一阶差分后的序列,我们进行拟合以获取其序列趋势。在这里我们选择**ARMA移动平滑自回归模型**。 #####1)模型介绍 **ARMA模型(auto regressive moving average model)**,即自回归滑动平均模型,是研究平稳随机过程有理谱的典型方法。其基本原理为:将预测指标随时间推移而形成的数据序列看作是一个随机序列,这组随机变量所具有的依存关系体现着原始数据在时间上的延续性。一方面,受影响因素的作用,另一方面,又有依存于自身变动规律。其关系式表达为 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/193813mmzmd00li3fdm0dc.jpg) 其中Y是预测对象的观测值,ε为误差。 #####2)模型参数估计 由于我们仅能得到模型的输出序列{x(n)},这时,参数估计是非线性的,难以求得ARMA模型参数的准确估值。因此工程上提出的最佳方法是分别估计AR和MA参数,而我们通常利用自相关图与偏相关图来分析。分析标准为 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/202032gq3gtgr3984446tq.png) 在Matlab中,利用`autocorr`和`parcorr`分别求自相关与偏相关函数。 ```matlab autocorr(Data.diffcloseprice1) %求自相关函数并画图 h=figure; parcorr(Data.diffcloseprice1) %求偏相关系数并画图 ``` 得到的自相关函数和偏相关函数图像分别为: ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/201505a4nlt3n6n7lvz8nt.jpg) ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/201738vjzgsszruzggfhae.jpg) 从上述图像看出,自相关和偏相关系数都为6阶截尾,并且他们都有明显的相关性,所以我们设p=6, q=6。 #####3)模型拟合与预测 根据以上分析,我们选用ARMA(6,6)对差分后序列进行拟合。 我们的思路是:取序列的前2100个值做样本进行ARMA模型测试拟合,然后用拟合出的函数预测样本外的序列值,并将预测值与原始序列作比较。 ```matlab m=armax(Data.diffcloseprice1(1:2100),'na',6,'nc',6); %截取数据部分使用模型进行拟合,这里系数分别为6,6 closepricepredict=predict(m,Data.diffcloseprice1,1); %用拟合函数预测序列 h=figure plot(datenum(datestr(Data.difftime1)),Data.diffcloseprice1,'b'); %原始序列(蓝色) hold on; plot(datenum(datestr(Data.difftime1(1:2100))),closepricepredict(1:2100),'r') %选取段序列拟合情况(红色) hold on; plot(datenum(datestr(Data.difftime1(2100:2349))),closepricepredict(2100:2349),'y') %作出样本外数据预测图形,跟原图形进行比较(黄色) dateaxis('x',1) title('ARMA regression and prediction') ``` 得到的图像为 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/prod/./data/attachment/forum/201805/11/212743jrcpsa4yica7yibn.jpg) 可以看到,总体上ARMA对差分后股票序列的波动趋势有较好的拟合效果,且样本外数据的拟合数据趋势也把握得较好,与原始序列基本一致。但是ARMA对序列的拟合幅度不够,在数据峰度上有较大偏差。一方面,这与ARMA的参数选取有关,可能是利用自相关、偏相关判断的方法不够精确。另一方面,ARMA模型的准确性极大依赖于序列的平稳性,而差分后序列的平稳性仍不高。 ------------------------------- ###Day 4 小结: 今天我们熟悉了AT中获取数据的各类函数,并开始了对数据的实际演练,以时间序列的ARMA模型为例进行了分析。那么相信到目前为止,大家对 Matlab 和 AT 的操作都有了一定的了解。从明天起,我们要开始学习策略的逻辑,并最终完成我们的第一份策略。
0个赞 收藏
发表评论
0条评论
contact@digquant.com.cn

联系

邮箱

0755-8695-2080

联系

电话

关注

微信

关注

QQ

回到

顶部