• WeQuant教程—1.4 实践教学:比特币量化定投


     在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块钱的比特币。

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

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

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

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

  • 相关阅读:
    正则表达式
    eclipse python开发环境搭建
    python中的构造函数和析构函数
    socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?
    Render和template?
    什么是MemCache
    python下 help()使用方法
    Tornado模块分类和各模块之间的关系
    把python项目部署到centos里
    Jquery对回复者添加匿名评论选项
  • 原文地址:https://www.cnblogs.com/bitquant/p/11560320.html
Copyright © 2020-2023  润新知