龙听期货论坛's Archiver

龙听 发表于 2018-3-15 11:22

量化交易策略—鳄鱼法则交易系统

[color=#323e32] 鳄鱼法则交易系统号称结合了控制论、信息理论、量子物理、混沌科学、分形几何学和全息理论。基本上,鳄鱼组线(Alligator)就是一个指南针,无论即时价格正向哪个方向移动,它都能让你保持适当的交易方向。[/color]

[color=#323e32]    一、鳄鱼线(Alligator)[/color]

[color=#323e32]    鳄鱼线扮演着使我们的交易保持正方向的方向盘角色。在有方向的趋势中,鳄鱼线会协助我们获利。它结合了非线性动力学和不规则碎形几何学的平均线。[/color]

[color=#323e32]    鳄鱼线及公式 [/color]

[color=#323e32][url=http://photo.blog.sina.com.cn/showpic.html#blogid=4ac2f6c10102wxa0&url=http://album.sina.com.cn/pic/001mSSqdzy75z0l5SiBc1][img=0,428]http://s2.sinaimg.cn/mw690/001mSSqdzy75z0l5SiBc1&690[/img][/url]

[/color]

[color=#323e32]    1.蓝线是鳄鱼的颚。它的画法是:取13根bar的平滑移动平均,将结果往未来的方向移动8根bar。[/color]

[color=#323e32]    2.红线是鳄鱼的牙齿。取8根bar的平滑移动平均,将结果往未来的方向移动5根bar。[/color]

[color=#323e32]    3.绿线是鳄鱼的上唇。取5根bar平滑移动平均数,将结果往未来的方向移动3根bar得到。[/color]

[color=#323e32]     当蓝红绿三条均线纠缠在一起,表示鳄鱼睡着了,当它从长眠中醒来会异常饥饿,会进一步追捕价格,直到满足。吃饱之后他就会闭上嘴巴,这是在告诉我们:取得利润并等待。所以,我们要在鳄鱼睡觉时逗留场外并等待,直到有碎形在下颚被触发。[/color]

[color=#323e32]鳄鱼线公式 [/color]

[color=#323e32]     Var1:=(H+L)/2; [/color]
[color=#323e32] [/color]
[color=#323e32]上唇:   REF(SMA(Var1,5,1),3), [/color]
[color=#323e32]牙齿:   REF(SMA(Var1,8,1),5), [/color]
[color=#323e32]下颚:   REF(SMA(Var1,13,1),8), [/color]

[color=#323e32]碎形—— 交易的起始[/color]

[color=#323e32]    碎形原理:是利用简单的多空原理而形成。 市场上涨时,买方追高价的意愿很高,价格就会不断上升,买方意愿将随价格的不断上升而逐渐减少,价格最终回跌。交易者意愿被市场新入的信息(混沌)所影响,此时市场处于低价值区,虽然目前的价值区买卖双方都同意,但对于价格有着不同看法,当买方意愿再度大于卖方意愿时价格就会上涨,如果这个买方的动能足以超越向上碎形时,我们将在向上碎形上一档积极进场。[/color]

[color=#323e32]碎形结构[/color]

[color=#323e32][url=http://photo.blog.sina.com.cn/showpic.html#blogid=4ac2f6c10102wxa0&url=http://album.sina.com.cn/pic/001mSSqdzy75z0lY1mS3e][img=0,284]http://s15.sinaimg.cn/mw690/001mSSqdzy75z0lY1mS3e&690[/img][/url]

[/color]

[color=#323e32]最典型的碎形结构如图中A型态。由连续5根的线条所组成,中间的高点一定最高(向下碎形则中间低点一定最低),中间线的左边有两根较低的高点,右边也有两根较低的高点(向下碎形则为左右各有两根较高的低点),你现在看自己的五根手指结构,就是典型的向上碎形。 分辨向上碎形时,我们只在乎高点的位置,向下碎形时,则只在乎低点的位置。[/color]
[color=#323e32]B.向上与向下碎形共享外围bar[/color]
[color=#323e32]C.向上、向下碎形由一根bar完成[/color]
[color=#323e32]D.如今天高点与之前高点相同,今天的bar不算在5根bar之内。[/color]

[color=#323e32]    深度研究可以参考《鳄鱼法则交易系统的设计》[/color]

[color=#323e32]交易系统设计[/color]

[color=#323e32]    寻找机会[/color]

[color=#323e32]    必须在鳄鱼睡着(最好是沉睡一阵子的鳄鱼,即BRG三线接近或相互纠缠)时进入市场。在市场建立仓位后,根据混沌法则不断加码。在价格未脱离鳄鱼上唇或下颚时不要主观判断方向。[/color]

[color=#323e32]    进场[/color]

[color=#323e32]    寻找有效碎形,在有效碎形的高/低点加/减一档作为买/卖的参考价位。并非所有有效讯号都能获利。[/color]

[color=#323e32]    止损[/color]

[color=#323e32]    以鳄鱼的牙齿(红线)作为依据,进场买入时若收盘价低于红线则停损出场,指初期进场时的止损。[/color]

[color=#323e32]    加仓[/color]

[color=#323e32]    第一个有效碎形触发后,建立原始仓位。之后可根据AC,AO等指标同向进场,例如价格在红线之上一直买入。也可以沿途不做任何加码动作。[/color]

[color=#323e32]    出场[/color]

[color=#323e32]    收盘低于鳄鱼牙齿(红线)或者鳄鱼上唇(绿线);[/color]
[color=#323e32]    出场价格在5根连续相同颜色的bar的低点加一档;[/color]
[color=#323e32]    AO、AC、碎形的反向讯号。   [/color]

[color=#323e32]示意图:[/color]



[color=#323e32]    这个策略主要选择那些『沉睡着的鳄鱼』进行操作。也就是均线纠缠和AO,AC指标徘徊在0附近的股票。可以按这个思路再深入下去。[/color]
[color=#323e32]AO、AC的源码贡献出来。[/color]

[color=#323e32]收益风险[/color]

[color=#323e32]源码:[/color]

[color=#323e32][code]
import numpy as np
def initialize(context):
    g.up_price = 0 #向上碎形最高价
    g.low_price = 0 #向下碎形最低价
    g.up_fractal_exists = False #判断有效向上碎形
    g.down_fractal_exists = False #判断有效向下碎形
    g.AO_index = [0] #存放连续的AO指标数据
    g.cal_AC_index = [] #计算AC指标中转存储
    g.AC_index = [0] #存放连续的AC指标数据
    g.amount = 0 #满仓仓位
    g.stock = ['160119.XSHE']
    set_benchmark('160119.XSHE')

#判断 向上 或 向下 碎形
def is_fractal(stock,direction):
    hist = history(5,'1d',direction,[stock],df = False)
    if direction == 'high'\
    and hist[stock][2] > hist[stock][0]\
    and hist[stock][2] > hist[stock][1]\
    and hist[stock][2] > hist[stock][3]\
    and hist[stock][2] > hist[stock][4]:
        g.up_price = hist[stock][2]
        return True
    elif direction == 'low'\
    and hist[stock][2] < hist[stock][0]\
    and hist[stock][2] < hist[stock][1]\
    and hist[stock][2] < hist[stock][3]\
    and hist[stock][2] < hist[stock][4]:
        g.low_price = hist[stock][2]
        return True
    return False

#通过比较碎形与红线位置,判断碎形是否有效
def is_effective_fractal(stock, direction):
    if is_fractal(stock,direction):
        hist = history(13,'1d','close',[stock],df = False)
        red_line = hist[stock][:-5].mean()
        close_price = hist[stock][-1]
        if direction == 'high':
            if close_price > red_line:
                g.up_fractal_exists = True
            else:
                g.up_fractal_exists = False
        elif direction == 'low':
            if close_price < red_line:
                g.down_fractal_exists = True
            else:
                g.down_fractal_exists = False

#N日内最高价格的N日线
def nday_high_point(stock,n):
    hist = history(2*n,'1d','high',[stock],df = False)[stock]
    high_point = []
    for i in range(n):
        high_point.append(max(hist[-5-i:-1-i]))
    return np.array(high_point).mean()

#N日内最低价格的N日线
def nday_low_point(stock,n):
    hist = history(2*n,'1d','low',[stock],df = False)[stock]
    low_point = []
    for i in range(n):
        low_point.append(max(hist[-5-i:-1-i]))
    return np.array(low_point).mean()

#AO=5日内(最高-最低)/2的5日移动平均-34日内(最高-最低)/2的34日移动平均
def AO_index(stock):
    g.AO_index.append(nday_high_point(stock,5)/2 + nday_low_point(stock,5)/2\
                      - nday_high_point(stock,34)/2 - nday_low_point(stock,34)/2)
    return g.AO_index[-1]

#AO-AO的5日平均值的5日平均
def AC_index(stock):
    AO_index(stock)
    if len(g.AO_index) >= 5:
        g.cal_AC_index.append(g.AO_index[-1] - np.array(g.AO_index[-5:]).mean())
        if len(g.cal_AC_index) >=5:
            g.AC_index.append(np.array(g.cal_AC_index[-5:]).mean())

#判断序列n日上行
def is_up_going(alist,n):
    if len(alist) < n:
        return False
    for i in range(n-1):
        if alist[-(1+i)] <= alist[-(2+i)]:
            return False
    return True

#判断序列n日下行
def is_down_going(alist,n):
    if len(alist) < n:
        return False
    for i in range(n-1):
        if alist[-(1+i)] >= alist[-(2+i)]:
            return False
    return True

#碎形被突破
def active_fractal(stock,direction):
    close_price = history(1,'1d','close',[stock],df=False)[stock][0]
    if direction == 'up' and close_price > g.up_price:
        return True
    elif direction == 'down' and close_price < g.low_price:
        return True

#进场,初始仓位50%
def set_initial_position(stock,context):
    close_price = history(1,'1d','close',[stock],df=False)[stock][0]
    g.amount = context.portfolio.cash/close_price
    order(stock, g.amount*0.8)
    log.info("buying %s 股数为 %s"%(stock,g.amount*0.7))
    g.down_fractal_exists = False

#卖出
def sell_all_stock(stock,context):
    order_target(stock,0)
    log.info("selling %s"%stock)
    g.up_fractal_exists = False

#加仓
def adjust_position(stock,context,position):
    order(stock,g.amount*position)
    log.info("adjust position buying %s 股数为 %s"%(stock,g.amount*position))

def handle_data(context,data):
    stock = g.stock[0]
    #计算AO,AC指标
    AC_index(stock)
    #止损
    #空仓时,寻找机会入场
    if context.portfolio.positions[stock].amount == 0:
        #计算向上碎形
        is_effective_fractal(stock,'high')
        #有效向上碎形存在,并被突破,买入
        if g.up_fractal_exists and active_fractal(stock,'up'):
            set_initial_position(stock,context)
    #有持仓时,加仓或离场
    else:
        close_price = history(13,'1d','close',[stock],df=False)
        red_line = close_price[stock][:-5].mean()
        #计算向下碎形
        is_effective_fractal(stock,'low')
        #出场条件1:有效向下碎形存在,并被突破,卖出
        if g.down_fractal_exists and active_fractal(stock,'down'):
            sell_all_stock(stock,context)
            return
        #出场条件2:AC
        #加仓10%:AO,AC同时5日上行,且收盘价走高
        if is_up_going(g.AO_index,5)\
        and is_up_going(g.AC_index,3)\
        and is_up_going(close_price[stock],2):
            adjust_position(stock,context,0.1)
        #减仓10%:AO,AC同时3日下行,且收盘价走低
        if is_down_going(g.AO_index,5)\
        and is_down_going(g.AC_index,3)\
        and is_down_going(close_price[stock],2):
            adjust_position(stock,context,-0.1)
    record(AOindex = g.AO_index[-1])
    record(ACindex = g.AC_index[-1])
[/code]
[/color]

沸水煮绿蛙 发表于 2020-10-15 11:36

图片看不到了

页: [1]