真格量化学习策略——海龟交易策略
海龟交易是什么
为了了解海龟交易,我们必须先介绍几个与业名词包括唐奇安通道、真实波幅、N 值(ATR) 和 Unit,如果你已经清楚明白了这些概念,也能够熟练地掌握他们的算法,那你大可直接跳过这一部分,进入策略实现的部分。
唐奇安通道
先让我们上一张图!
图中这个完全将 K 线包裹在内的通道线就是唐奇安通道,它的上线与下线分别取的是 20 日 最高价与最低价,因此当当前价格突破上线戒者下线的时候,都能作为很好的突破信号。就像上图图中所示,当价格突破上线的时候,往往意味着一轮向上行情的开启,我们在这个时候迚进多仓买入操作。类似的,当价格突破下线的时候,往往意味着一轮向下行情的开启, 我们在这个时候迚行卖空操作。
这就是海龟交易法的基础。
我们可以这样编写获取开平仓信号的函数。
而 price_list 是这样的参数。
当然,作为一个成熟的交易法则,我们还需要一些指标来判断加仓点、止损点不每次买入卖 出的数量。而用来判断的依据,我们叫做真实波幅不 N 值(ATR)。
真实波幅
话不多说先上公式!
TrueRange = MAX(High - Low, |preclose - HIgh|, |preclose - Low|)
其中:High 是指当日最高价,Low 为当日最低价,pre_close 是指前一日收盘价。
公式看上去很复杂,其实它要表达的就是昨日收盘以后股票的最大波幅,让我们来看看 K 线图里真实波幅具体指哪一部分。
从图片中我们可以很容易的看出,真实波幅就是昨天收盘后股票的最大振幅,也就是图片中最长的那一根箭头所表示的位置。
N 值(ATR)
N 值是海龟交易法当中非常重要的一个概念,它还有一个名字,那就是 ATR(Average True Range),也就是平均真实波幅的意思,话不多说,先上计算方式!
求真实波幅的 N 日移动平均:
1.将前 N 天的 ATR 乘以 N-1;
2.将步骤一所得值加上新一天的 TR;
3.将步骤二所得值除以 N.
从公式可以看出,N(ATR)值其实就是标的 days 日内的平均真实波幅,当这个值大的时候,就说明这段时间股票每一天的波动率都很大,当这个值小的时候,就说明这段时间每一天的波动率都很小。
因此在海龟交易法中,每当标的价格上涨(下跌)0.5 个 N(ATR)时,我们就加仓 1 个 Unit 的多头(空头)仓位;当标的价格上涨(下跌)2 个 N(ATR)时,我们就对空头(多头)仓位进行平仓止损。
在真格量化平台上有专门的获取指标函数 CreateIndicator,这样我们就不用专门编写函数去计算相应指标了。下面我们就看看如何用 CreateIndicator 来获取 ATR 值,需要注意的是这段代码的实现是在 OnBar 事件中。
这是相应的计算加仓不平仓信号的函数,这里的加仓信号为 1,平仓信号为-1。
Unit
知道了买点、卖点、止损点与加仓点,我们就需要知道每一次建仓与加仓都需要购买多少数 量,老规矩,看公式!
其中:Account 表示账户中的总资产,coef 为该商品期货一手的数量,如铜为 5 吨一手, 则对铜的商品期货来说,coef 就等亍 5。下图中就是一个计算 unit 的函数,这里使用一个字典来存储期货的每手数量,若需要添加其他品种时,在字典里添加相关信息即可。
策略实现
到这里,相信你已经知道什么是海龟交易法了,让我们来总结一下这个策略究竟是怎样的吧!
计算期货标的的 N(ATR)与 Unit;
判断价格是否突破了唐奇安通道,若是向上突破则多头仓位开仓,空头仓位平仓;向下突破 则空头仓位开仓,多头仓位平仓;
若期货价格高亍(低亍)上次买入价格 0.5 个 ATR,则加仓一个 Unit 的多头(空头)仓位;
若期货价格低亍(高亍)上次买入价格 2 个 ATR,则平仓多头(空头)仓位止损。
代码实现
最后就是详细的代码实现了
首先要设定我们需要引用的库
另外我们需要编写一个重置参数的函数,在每次平仓之后都要用到。
再在添加了前文提到过的所有函数之后,我们之后就可以迚入程序的主体部分。
在 Onstart 事件中初始化参数并登录交易账号。
在 OnMarketQuotationInitialEx 事件中获取主力合约并订阅需要的 K 线数据。
在 OnBar 事件中先进行一些准备工作,如取得当前合约价格。
若有持仓,获取相应仓位。
获取之前交易日的数据用亍计算需要的指标。
值得注意的是有可能在我们还没有平仓时期货主力合约就发生了改变,这就需要我们手动去判断平仓。
当我们通过前文提到的函数获取交易信号时,需要执行的交易代码如下:
加仓部分
平仓部分
开仓部分——获取开仓信号
开仓部分——多头开仓
开仓部分——空头开仓
到此为止所有的代码就都编写完毕了,之后就是通过回测来检验策略效果了。
代码复制过来,根本运行不了,好多小错误。
90行 和 94行 的中括号0 代表什么? 如果加过仓的话还是0吗
策略思路不错。谢谢分享!有个小问题请教一下,我在克隆此策略,换了品种和周期时,有的周期回测成功的,换个周期回测,会报:ERROR - 下单失败。Resp:FuncNo:6021, ItemNum:1, Requestno:39, ErrorNo:-2003, ErrorInfo: 可用资金:12,不知道是什么原因。
此文甚好,小编辛苦,