什么是Aberration策略?
Aberration 交易系统由Keith Fitschen 于 1986 年发明,1993 年Keith Fitschen 将该系统商业化发布在 Future Trust 杂志上,有趣的是Keith并不是交易员出生,他在美国空军服役超过20年,专攻武器的导航系统,在时间序列数据的处理上有深厚的功力。自发布之日起,该系统业绩一直名列前茅,在1997 年、2001 年、2005 年已发布交易系统的业绩排名中该系统 均排第一,并曾创下多年收益100%以上的记录。该交易系统的特点是同时交易在8 种不同的品种上,包括谷物、肉类、金属、能源、外汇、金融以及股指期货等。
Aberration交易系统的交易频率常常是每年交易某一品种3-4 次,60%的时间都持有仓位,平均每笔交易持仓 60 天。它通过长线交易捕捉趋势来获取巨额利润。那它如何来弥补亏损呢?因为它同时交易在多个不相关的市场, 当某一品种损失时,另一品种可能获利。在一年的时间里,总是有某一种或者多种品种能获得巨额利润。这些大的利润弥补了那些没趋势市场的小额亏损。Aberration交易系统对资金进行组合管理,因此可以接受比较大的资金量。
// An highlighted block
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = "Ringo"
wx='1985159637'
'''
Aberration策略 (难度:初级)
参考: https://www.shinnytech.com/blog/aberration/
注: 该示例策略仅用于功能示范, 实盘时请根据自己的策略/经验进行修改
'''
from tqsdk import TqApi, TqAuth, TargetPosTask
from tqsdk.ta import BOLL
# 设置合约代码
SYMBOL = "DCE.m2105"
api = TqApi(auth=TqAuth("信易账户", "账户密码"))
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("当前空仓,未穿越中线,仓位无变化")