在wequant.io,为了让读者能直接体验量化系统的魅力,我们用前面的思路,实现了一套完整的量化系统和回测工具,这个系统非常简单,用户只需要把交易意志用策略表达出来,系统就可以自己完成交易效果的回测,和实盘交易的接入。

我们使用数字货币比特币作为量化交易标的。使用比特币的好处有几个:

  1. 品种单一,计价方式简单;
  2. 24小时不间断交易;
  3. 交易资金门槛低;
  4. 接口授权简单。

接下来要做的,就是学习用WeQuant的标准,以完成一份有效的策略。我们将以比特币定投为例(定期自动买入比特币,来换取比特币升值收益),作一个简单的介绍。

基本名词介绍

bar

这里的bar不是指酒吧,是金融交易里面的行情bar,是一个图形概念。如果你多多少少看过交易的行情图,横向排列的高低不同的“小柱子”,每一根柱子都称为一个bar。

bar跟时间是高度关联的。bar记录了固定间隔内,从开始时间到结束时间,价格的信息,常规的bar会记录如下价格信息:开始价格(开盘价)、结束价格(收盘价)、最高价、最低价。一般来说,bar还会附带成交数量的信息。

bar在我们的量化系统里面有什么用呢?除了提供基础的价格信息,在WeQuant设计的量化系统里面,策略是循环不间断地运转的,bar是循环的依据。

为什么需要bar来支持循环呢?我们知道,bar是天然带有时间属性的信息合集,在图形里,左边的bar比右边的bar发生的更早,最右边的bar反映的是当前最新的动态,于是,我们可以利用bar的时间属性,让程序从左往右依次读取bar,来实现“从某时至某时”或者“实时不间断”的信息获取和计算的目的,既不遗漏,也不重复,时间间隔固定,于是我们在写策略的时候,可以省略掉很多时间定义和处理的步骤,只需要关心在所读取的当前的bar里面,设计交易触发条件“如果 => 那么”——从而,整个策略的设计和编写,由于bar的循环的帮助,变得非常简单。

bar就像老式时钟的钟摆,每摆一下,时间就往前进一格。只要bar不停地在更新和读取,我们的策略就会不断地运行。bar跟前面几篇文章提到的行情系统,有极大的关联。

bar本身有频率的区分,区别就是每隔多少时长汇总一根bar。WeQuant提供分钟、小时、天、周级别的bar,来满足执行频率不同的策略的要求。目前WeQuant提供的bar,主要针对数字货币交易市场,由于中间不休市,bar与bar之间所表示的时间区段是连续的,即紧密相连,不存在缝隙。

frequency

与bar密切相连,由于bar表示的是固定时间间隔内的价格信息,这里的frequency就是用来指定固定时间间隔有多长。

frequency有个正经的中文翻译叫频率,频率的单位是赫兹(次/秒)。而我们为了省略换算的复杂(很多人算不过来),frequency设定的值仅作代指而非学术上的频率值,例如当frequency为1分钟时,实际上我们说的是给策略指定成“依据1分钟时长的bar,每1分钟执行一次策略,所换算出来的频率值”。这段话献给特别较真的朋友们。

函数

这是编程语言的概念,不作累述。在WeQuant的策略模板里面,只需要在策略里定义清楚两个函数,策略就可以生效。具体是哪两个函数需要定义,后文会作示例讲解。

除了用户需要自己编写函数之外,WeQuant本身提供了一些列的函数来辅助完成策略的表达,包括但不限于获取历史数据、获取帐号信息、操作订单、计算和保存变量等等。详细的定义和使用方法,请在需要的时候移步至专门的API文档。

参数

由于策略需要跟量化系统作整合,我们要求在策略里添加一些预设的但跟交易逻辑本身无关的变量,让策略变得机器可读,使用方法请看示例,详细说明看API文档。

一个基本的策略-比特币定投

我们对上文进行一个简单的汇总,一个WeQuant标准的策略应该长这个样子:

PARAMS = { "start_time": "2016-09-20 00:00:00", # 回测起始时间 "end_time": "2016-10-21 00:00:00", # 回测结束时间 "slippage": 0.02, # 设置滑点 "account_initial": {"huobi_cny_cash": 10000, "huobi_cny_btc": 3}, # 设置账户初始状态}def initialize(context): context.frequency = "1d" context.benchmark = "huobi_cny_btc" context.security = "huobi_cny_btc"def handle_data(context): if context.account.huobi_cny_cash > 100: context.order.buy(context.security, cash_amount="100")

我们看到,策略分成三部分,分别定义PARAMS(参数)变量、initialize和handle_data函数(分别需要传入context参数)。

  • PARAMS里面定义回测的起始时间、结束时间、帐号初始资金和初始比特币数量、滑点误差率(就是交易过程产生的误差,解释另附);
  • initialize函数设置context变量,包括frequency、基准品种价格、操作品种、用户自定义变量;
  • handle_data函数写实际的策略逻辑,即每次读取bar的时候,按照什么条件触发订单。

这个策略什么意思呢?刨除掉其他设置的细节(想了解的话,请阅读API文档),我们只看handle_data里的内容:

def handle_data(context): # 如果火币帐号里面的现金余额,大于用户设定的阈值(设为100), # 则触发下单条件: if context.account.huobi_cny_cash > 100: # 按照市价购买100元金额的比特币 context.order.buy(context.security, cash_amount="100")

代码的意思是,每天,检查账户里是不是剩余超过100块钱,如果超过,则按照当前的价格买入100块钱的比特币。

这样写完以后,平台就自动每天帮你买比特币了,作为一个自动化的定投策略,是不是很简单?

实际的定投策略会比这个更智能一些,那只是下单逻辑有了一些变化,整体的结构还是一样的,此处为了简化教学目的。

在回测阶段,这段代码也是可用的,而且可以从回测结果里面看到,因为比特币价格在上涨,所以这个定投策略也是挣钱的呢。

基本概念先介绍到这里。如果希望看更复杂的策略,策略讲堂里面有目前主流经典教科书策略的比特币版本,希望你们喜欢。

WeQuant教程—1.4 实践教学:比特币量化定投的更多相关文章

  1. WeQuant教程—1.2 从简单的量化系统开始

    你大概知道量化的思想最早在古巴比伦人计算行星轨迹的时候就已经诞生(算术运算),后来借助古希腊的形式化逻辑的发展,人们日益能从量化的思想中提炼和描述自然规律并运用到生产之中.不过,基于量化的思想打造一个 ...

  2. WeQuant教程—1.3 利用回测工具降低交易风险

    量化系统投入实际使用之前,人们会希望提前测试交易的效果.这个期间往往涉及代码的改动和参数的调整.最常见的做法是将历史数据输入量化系统,让量化系统根据既定的交易逻辑进行操作,观察和分析交易结果,找到问题 ...

  3. EffectiveTensorflow:Tensorflow 教程和最佳实践

    Tensorflow和其他数字计算库(如numpy)之间最明显的区别在于Tensorflow中的操作是符号. 这是一个强大的概念,允许Tensorflow进行所有类型的事情(例如自动区分),这些命令式 ...

  4. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系

    不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...

  5. Sublime Text3工具的安装、破解、VIM功能vintage插件教程(已经实践、绝对可用)

          工欲善其事,必先利其器.Sublime Text是一款很好的开发工具,开发php项目很好用,尤其是Sublime Text的一些插件功能,可以享用VIM的快捷编辑和html.js等自动补全 ...

  6. 大爽Python入门教程 2-5 *拓展实践,对比与思考

    大爽Python入门公开课教案 点击查看教程总目录 本文偏难. 推荐等第一二三四章上完后,回过来拓展阅读. 基础情景思考 假设有这样一张成绩表 最左边的一列是名字,起名麻烦. 这里直接用ABC...来 ...

  7. 【转】一篇很全面的freemarker教程---有空慢慢实践

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...

  8. python爬虫实践教学

    i春秋作家:Mochazz 一.前言 这篇文章之前是给新人培训时用的,大家觉的挺好理解的,所以就分享出来,与大家一起学习.如果你学过一些python,想用它做些什么又没有方向,不妨试试完成下面几个案例 ...

  9. Lance老师UI系列教程第九课->高仿比特币监控大师

    http://blog.csdn.net/lancees/article/details/22898971

随机推荐

  1. 项目Beta冲刺(团队)——05.24(2/7)

    项目Beta冲刺(团队)--05.24(2/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第2 ...

  2. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  3. 通信、端点、IO、文件

    什么是网络套接字(Socket)?一时还真不好回答,而且网络上也有各种解释,莫衷一是.下文将以本人所查阅到的资料来说明一下什么是Socket. Socket定义 Socket在维基百科的定义: A n ...

  4. React Virtual DOM Explained in Simple English

    If you are using React or learning React, you must have heard of the term “Virtual DOM”. Now what is ...

  5. Bounding Box回归

    简介 Bounding Box非常重要,在rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年cvpr最新的yolo9000都会用到. 先看图 对于上图 ...

  6. Numpy | 06 从已有的数组创建数组

    numpy.asarray numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个. numpy.asarray(a ...

  7. 在没有符号和FPO的情况下遍历堆栈(帧指针省略)

    下面是应用程序崩溃转储的调用堆栈.报告的崩溃是名为“HelperLibrary”的模块内的访问冲突,我们没有该模块的符号或源代码.调用堆栈看起来不太可能: 0:000> kv ChildEBP ...

  8. 【数论】[逆元,错排]P4071排列计数

    题目描述 求有多少种长度为n的系列A,满足以下条件: 1~n这n个数在序列中各出现一次:若第i个数a[i]的值为i,则称i是稳定的.序列恰有m个数是稳定的. 输出序列个数对1e9+7取模的结果. So ...

  9. 《ELK Stack权威指南》读书笔记

    Logstack: 1.Logstack介绍:Logstash is an open source data collection engine with real-time pipelining c ...

  10. JavaScript设计模式经典-面向对象中六大原则

    作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则( ...