时间序列数据分析与Tick数据回测

Author: , Created: 2019-08-08 10:05:45, Updated: 2023-10-20 20:11:54

img

时间序列数据

时间序列是指在连续的等间隔时间段获取的数据序列。在量化投资中,这些数据主要表现为价格和所跟踪投资标的的数据点的移动。例如股票价格,在指定的时间段内定期记录的时间序列数据可以参照以下的这幅图,读者会得到的更加清晰的认识:

img

可以看到,日期位于x轴上,价格则显示在y轴上。在这种情况下,“连续间隔时间段”意味着x轴上的天数相隔为14天:注意2005年3月7日和下一个点之间的差异,2005年3月31日 2005年4月5日和2005年4月19日。

然而,当您使用时间序列数据时,您经常会看到的不仅仅是这种只包含日期和价格两列的数据。大多数情况下,您将使用包含五列数据:数据周期,开盘价,最高价,最低价和收盘价。这意味着,如果您的数据周期设置为日线级别,那么当日的高,开,低,收价格变动就会反应在这个时间序列的数据当中。

什么是Tick数据

Tick数据就是交易所中最详尽的交易数据结构。也是上文提到的时间序列数据的一种扩展形态,包括:开盘价、最高价、最低价、最新价、成交量、成交额。如果把交易数据比喻成河流,Tick数据就是这个河流在某个横截面的数据。

img

如上图所示,国外交易所每个动作都会实时推送到市场上来。而国内交易所,每秒两次进行检查,如果该时间段内有动作,则生成一次快照并且推送出来。相比较而言,数据的推送充其量只能算做 OnTime,而不能叫做OnTick。

本教程的所有代码和时间序列数据的获取都在发明者量化平台上完成。

发明者量化的Tick数据

尽管国内Tick数据并不是真正意义上的 Tick,但是使用这种数据进行回测,至少可以无限接近和还原了现实。每个Tick中显示着当时这个商品在市场中的主要参数,并且在实盘中我们的代码,就是跟着理论每秒 2 次的Tick在进行计算。

img

不仅如此,在 发明者量化 中即使加载的是1小时周期的数据,依然可以调整数据粒度,比如将数据粒度调整为 1 分钟。此时此刻的1小时K线就是用1分钟数据组成的。当然,粒度越小,精度越高。更为强大的是,如果将数据切换为实盘级Tick,就可以无缝还原真实的实盘环境。即1秒2次Tick交易所的真实数据。

img

现在,您已经了解了完成本教程所需了解的基本概念。这些概念很快就会回来,您将在本教程的后面部分了解更多相关概念。

关于这部分的内容,感兴趣的朋友请到:https://www.fmz.com/bbs-topic/1651 查看更多信息

设置工作环境

工欲善其事,必先利其器,我们需要先在发明者量化平台部署托管者,关于托管者的概念,各位有编程经验的读者可以把它想象成一种官方封装好的Docker系统,这套系统里面已经封装好了各种主流交易所的公共API接口和以及对于策略编写和回测的细枝末节的技术细节。建立这套系统的初衷即是免去各位量化交易员在使用发明者量化平台的时候,能把精力放在策略的编写和设计上,这些技术细节以封装的形式呈现给策略作者以省去他们很多时间和精力。

  • 发明者量化平台的托管者系统的部署

托管者的部署分为两种方式

A方法:用户自己租用或者购买服务器,在各大云计算平台如AWS,阿里云,Digital Ocean和谷歌云上部署。优点是无论策略安全性,还是系统安全性都有保证,对于发明者量化平台来讲,鼓励用户用此方法,这样的分布式部署免去了服务器被攻击的隐患(无论是客户还是平台本身)

关于这部分内容,读者可以参考:https://www.fmz.com/bbs-topic/2848

B方法:使用发明者量化平台的公共服务器部署,平台提供香港,伦敦和杭州三地部署,用户可根据想要交易的交易所的位子,按就近原则部署。此方面优点是简单容易,一键完成,特别适合初学者用户,不用去了解购买Linux服务器时的诸多事宜,也免去了学习Linux命令的时间精力,价格也相对便宜,对于资金量不大的用户,平台建议使用这种部署方法。

img

本文为了照顾各位初学者理解,将采用B方法。

具体操作为:登陆FMZ.COM,点击控制中心,托管者,在托管者页面点击一键租用托管者。

输入密码,成功部署后如下图所示:

img

  • 机器人系统的概念与托管者之间的关系

如上文所述,托管者就像一个docker系统,一个docker系统就像一套标准,我们部署好了这套标准,接下来需要为这个标准产生一个“实例”,这个“实例”就是一个机器人。

创建机器人很简单,在部署好托管者后,点击左边的机器人栏目,点击创建机器人,在标签名称中填写一个名字,托管主机当中选择刚才部署好的托管者。下边的对话框中的参数选择和K线周期等可根据具体情况进行选择,主要是要配合交易策略选择。

img

至此,我们的工作环境已经搭建完成,可以看到,十分简单有效,各个功能各司其职。接下来,我们要开始量化策略的编写。

用Python实现一个简单的均线策略

上面我们提到了时间序列数据和Tick数据的概念,接下来我们用一个简单的均线策略把这两个概念链接起来。

  • 均线策略的基本原理

通过一根慢周期均线,比如7日均线,和一根快周期均线,比如3日均线。把他们应用在同一K线图上,当快周期均线上穿慢周期均线,我们称之为金叉;当慢周期均线下穿快周期均线,我们称之为死叉。

开仓的根据就是金叉开多单,死叉开空单,平仓的道理相同。

让我们打开FMZ.COM,登陆账号,控制中心,策略库,新建策略,在左上角策略编写语言中,选择Python。以下是这个策略的代码,每一行都有非常详细的注释,请各位读者慢慢体会。此策略非实盘策略,切勿用真钱进行实验,主要是让大家对策略编写又一个大致的概念和学习的模版。

import types # 导入Types模块库,这是为了应对代码中将要用到的各种数据类型

def main(): # 主函数,策略逻辑从这里开始
    STATE_IDLE = -1 # 标记持仓状态变量
    state = STATE_IDLE # 标记当前持仓状态
    initAccount = ext.GetAccount() #这里用到了现货数字货币交易类库(python版),编写策略时记得勾选上,作用是获得账户初始信息
    while True: # 进入循环
        if state == STATE_IDLE : # 这里开始开仓逻辑
            n = ext.Cross(FastPeriod,SlowPeriod) # 这里用到了指标交叉函数,详情请查看https://www.fmz.com/strategy/21104
            if abs(n) >= EnterPeriod : # 如果n大于等于入市观察期,这里的入市观察期是为了防止一开盘就胡乱开仓。
                opAmount = _N(initAccount.Stocks * PositionRatio,3) # 开仓量,关于_N的用法,请查看官方API文档
                Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # 建立一个变量,用于存储开仓状态,并执行开仓操作
                if Dict :  # 查看dict变量的情况,为下面的日志输出做准备
                    opAmount = Dict['amount']
                    state = PD_LONG if n > 0 else PD_SHORT # PD_LONG和PD_SHORT均为全局常量,分别用来表示多头和空头仓位。
                    Log("开仓详情",Dict,"交叉周期",n) # 日志信息
        else: # 这里开始平仓逻辑
            n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # 指标交叉函数,
            if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # 如果经过了离市观察期且当前账户状态为持仓状态,进而判断金叉或者死叉
                nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
                Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # 平仓逻辑,是多头就平多头,是空头就平空头。
                state = STATE_IDLE # 标记平仓后持仓状态。
                nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
                LogProfit(nowAccount.Balance - initAccount.Balance,'钱:',nowAccount.Balance,'币:',nowAccount.Stocks,'平仓详情:',Dict2,'交叉周期:',n) # 日志信息
        Sleep(Interval * 1000) # 循环暂停一秒,防止API访问频率过快导致账户被限制。

  • 均线策略的回测

在策略编辑页面,我们完成了策略的编写,接下来,我们要回测这个策略看其在历史行情中的表现如何,回测在任何量化策略开发中都发挥着重要的作用,但是同时也只能作为重要的参考,回测不等于利润保证,因为市场是不断变化的,回测只是一种事后诸葛亮的行为,任然属于归纳法范畴,市场是演绎的。

点击模拟回测,可以看到有很多可以调节的参数,可以直接在里面修改,对于以后策略越来越复杂,参数越来越多,这种方式的修改可以帮助用户免去再到代码中逐个修改的烦恼,方便快捷,且条理清晰。

img

后边的调优选项可以自动优化所设置参数,系统会尝试各种最优的参数,帮助策略开发者找到最优选择。

通过以上例子,我们可以看到,量化交易的基础即是通过时间序列数据的分析,和tick数据的回测交互进行的,再复杂的逻辑,都离不开这两样基本的要素。差别不过是维度的不同,比如高频交易,就需要更详细的数据切面,更丰富的时间序列数据。再比如套利交易,对于回测样本的数据要求就比较大,可能需要某两个交易标的十几年的连续深度数据以找出他们利差扩大与缩小的统计结果。以后的文章我会陆续介绍高频交易,和套利交易的策略,大家敬请期待。


Related

More