什么是Aberration策略?
Aberration 交易系统由Keith Fitschen 于 1986 年发明,1993 年Keith Fitschen 将该系统商业化发布在 Future Trust 杂志上,有趣的是Keith并不是交易员出生,他在美国空军服役超过20年,专攻武器的导航系统,在时间序列数据的处理上有深厚的功力。自发布之日起,该系统业绩一直名列前茅,在1997 年、2001 年、2005 年已发布交易系统的业绩排名中该系统 均排第一,并曾创下多年收益100%以上的记录。该交易系统的特点是同时交易在8 种不同的品种上,包括谷物、肉类、金属、能源、外汇、金融以及股指期货等。
Aberration交易系统的交易频率常常是每年交易某一品种3-4 次,60%的时间都持有仓位,平均每笔交易持仓 60 天。它通过长线交易捕捉趋势来获取巨额利润。那它如何来弥补亏损呢?因为它同时交易在多个不相关的市场, 当某一品种损失时,另一品种可能获利。在一年的时间里,总是有某一种或者多种品种能获得巨额利润。这些大的利润弥补了那些没趋势市场的小额亏损。Aberration交易系统对资金进行组合管理,因此可以接受比较大的资金量。
Futures Truth排名 | ||
排名 | 2001 | 2005 |
1 | Aberration | Aberration |
2 | Basis II | Basis II |
3 | DCS-II | Checkmate |
4 | Dollar Trader | Dollar Trader |
5 | DynamicBreakOut | Golden SX |
6 | Golden SX | R-Breaker |
7 | GrandCayman | R-Mesa |
8 | R-Breaker | ReadySetGo |
9 | STC_S&P_DayTrade | STC_S&P_DayTrade |
10 | TrendChannel | TrendChannel |
资料来源:http://www.quanttech.cn/2016/lbfb_0926/12.html
策略基本原理
上下轨的确定
Aberration由三条通道线组成,其中中轨为一定周期的移动平均线(AveMa),上下轨为中轨的基础上上下加减一定的价格标准差(StdValue),也就是我们熟知的布林线,系统构造十分简洁优美。
具体计算过程如下:(策略源码在文章最后)
- 计算中轨:周期为N的平均移动线
- 计算标准差: 标准差K
- 设置参数:p
- 计算上轨:上轨 = 中轨+ p*K
- 计算下轨:下轨 = 中轨-p*K
# 使用BOLL指标计算中轨、上轨和下轨,其中26为周期N ,2为参数p def boll_line(klines): boll = BOLL(klines, 26 , 2) midline = boll["mid"].iloc[-1] topline = boll["top"].iloc[-1] bottomline = boll["bottom"].iloc[-1] print("策略运行,中轨:%.2f,上轨为:%.2f,下轨为:%.2f" % (midline, topline, bottomline)) return midline, topline, bottomline
开仓条件
开多仓条件:上穿上轨开多;
开空仓条件:下穿下轨开空。
# 判断开仓条件 if position.pos_long == 0 and position.pos_short == 0: # 如果最新价大于上轨,K线上穿上轨,开多仓 if quote.last_price > topline: print("最新价大于上轨,K线上穿上轨,开多仓") target_pos.set_target_volume(20) # 如果最新价小于下轨,K线下穿下轨,开空仓 elif quote.last_price < bottomline: print("K线下穿下轨,开空仓") target_pos.set_target_volume(-20) else: print("当前最新价%.2f,未穿上轨或下轨,不开仓" % quote.last_price)
空仓条件
多头:跌破中轨离场;
空头:突破中轨离场。
# 在多头情况下,空仓条件 elif position.pos_long > 0: # 如果最新价低于中线,多头清仓离场 if quote.last_price < midline: print("最新价低于中线,多头清仓离场") target_pos.set_target_volume(0) else: print("当前多仓,未穿越中线,仓位无变化") # 在空头情况下,空仓条件 elif position.pos_short > 0: # 如果最新价高于中线,空头清仓离场 if quote.last_price > midline: print("最新价高于中线,空头清仓离场") target_pos.set_target_volume(0) else: print("当前空仓,未穿越中线,仓位无变化")
回测
回测初始设置
初始账户资金:100万
回测日期:2019.7.19 —— 2019.8.26
策略参数:布林曲线计算周期为27,参数为2
多、空头开仓手数:20手
合约:DCE.i2001
Abberation策略回测结果 | |||||
合约代码 | 合约品种 | 收益率 | 风险度 | 最大回撤 | 年化夏普率 |
DCE.i2001 | 铁矿 | 25.79% | 7.68% | 3.70% | 6.4413 |
天勤内该策略源码
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "Ringo" from tqsdk import TqApi, TargetPosTask from tqsdk.ta import BOLL # 设置合约代码 SYMBOL = "DCE.i2001" api = TqApi() quote = api.get_quote(SYMBOL) klines = api.get_kline_serial(SYMBOL, 60*60*24) position = api.get_position(SYMBOL) target_pos = TargetPosTask(api, SYMBOL) # 使用BOLL指标计算中轨、上轨和下轨,其中26为周期N ,2为参数p def boll_line(klines): boll = BOLL(klines, 26 , 2) midline = boll["mid"].iloc[-1] topline = boll["top"].iloc[-1] bottomline = boll["bottom"].iloc[-1] print("策略运行,中轨:%.2f,上轨为:%.2f,下轨为:%.2f" % (midline, topline, bottomline)) return midline, topline, bottomline midline, topline, bottomline = boll_line(klines) while True: api.wait_update() # 每次生成新的K线时重新计算BOLL指标 if api.is_changing(klines.iloc[-1],"datetime"): midline, topline, bottomline = boll_line(klines) # 每次最新价发生变化时进行判断 if api.is_changing(quote,"last_price"): # 判断开仓条件 if position.pos_long == 0 and position.pos_short == 0: # 如果最新价大于上轨,K线上穿上轨,开多仓 if quote.last_price > topline: print("最新价大于上轨,K线上穿上轨,开多仓") target_pos.set_target_volume(20) # 如果最新价小于轨,K线下穿下轨,开空仓 elif quote.last_price < bottomline: print("K线下穿下轨,开空仓") target_pos.set_target_volume(-20) else: print("当前最新价%.2f,未穿上轨或下轨,不开仓" % quote.last_price) # 在多头情况下,空仓条件 elif position.pos_long > 0: # 如果最新价低于中线,多头清仓离场 if quote.last_price < midline: print("最新价低于中线,多头清仓离场") target_pos.set_target_volume(0) else: print("当前多仓,未穿越中线,仓位无变化") # 在空头情况下,空仓条件 elif position.pos_short > 0: # 如果最新价高于中线,空头清仓离场 if quote.last_price > midline: print("最新价高于中线,空头清仓离场") target_pos.set_target_volume(0) else: print("当前空仓,未穿越中线,仓位无变化")
点击了解天勤量化