geek001 发表于 2019-8-24 14:43:08

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

关于交易系统的介绍和相关概念见上一篇:《量化交易策略—鳄鱼法则交易系统》


1.选股

    选择沪深300指数成分股;沉睡的鳄鱼(选择连续20交易日处于沉睡状态的股票,建立buy_stock池);每6个月更新股票池;benchmark沪深300指数。

2.入场

    存在有效碎形;有效碎形被突破;AO指标连续5日上行;AC指标连续3日上行;收盘价高于前一日收盘价;按g.amount=总资金/股票池股数×乘数因子3买入。

3.止损&止盈

    个股累计收益率(以成本价为基准)超过30%,全部卖出;
    个股累计收益率下跌10%,全部卖出;
    大盘3日累计收益率下跌3%,全部股票清仓。

4.加仓&减仓

    AO连续5日下跌,AC连续3日下跌减仓10%;AO连续5日上行,AC连续3日上行加仓10%。

5.退出

    存在有效向下碎形,向下碎形被突破,全部卖出。


源码:t numpy as np
def initialize(context):
    g.up_price = {} #向上碎形最高价
    g.low_price = {} #向下碎形最低价
    g.up_fractal_exists = {} #判断有效向上碎形
    g.down_fractal_exists = {} #判断有效向下碎形
    g.AO_index = {} #存放连续的AO指标数据
    g.cal_AC_index = {} #计算AC指标中转存储
    g.AC_index = {} #存放连续的AC指标数据
    g.amount = {} #满仓仓位
    g.stock = get_index_stocks('000300.XSHG')
    g.buy_stock = []
    set_benchmark('000300.XSHG')
    g.month = context.current_dt.month
    run_monthly(select_universe,1,'open')

#重置全局变量
def reset_global():
    g.up_price = {} #向上碎形最高价
    g.low_price = {} #向下碎形最低价
    g.up_fractal_exists = {} #判断有效向上碎形
    g.down_fractal_exists = {} #判断有效向下碎形
    g.AO_index = {} #存放连续的AO指标数据
    g.cal_AC_index = {} #计算AC指标中转存储
    g.AC_index = {} #存放连续的AC指标数据
    g.amount = {} #满仓仓位
    g.buy_stock = []

def initial_stock_global(stock):
    g.up_price = 0
    g.low_price = 0
    g.up_fractal_exists = False
    g.down_fractal_exists = False #判断有效向下碎形
    g.AO_index = #存放连续的AO指标数据
    g.cal_AC_index = #计算AC指标中转存储
    g.AC_index = #存放连续的AC指标数据
    g.amount = 0 #满仓仓位

#轮换选股后清空持仓
def reset_position(context):
    for stock in g.buy_stock:
      order_target(stock,0)
      log.info("sell %s for reset position"%stock)
#选股
def select_universe(context):
    #每三个月操作一次
    month = context.current_dt.month
    if month%6 != g.month%6:
      return
    #清空全局变量
    reset_position(context)
    reset_global()
    hist = history(30,'1d','close',g.stock,df = False)
    for stock in g.stock:
      if is_sleeping_alligator(stock,hist,20):
            g.buy_stock.append(stock)
            #初始化该股票全局变量
            initial_stock_global(stock)
    print g.buy_stock
    return None

#睡着的鳄鱼
def is_sleeping_alligator(stock,hist,nday):
    for i in range(nday):
      if is_struggle(stock,hist,i) == False:
            return False
    return True

#均线纠缠,BRG三线非常接近
def is_struggle(stock,hist,delta):
    blue_line = hist[-21-delta:-8-delta].mean()
    red_line = hist[-13-delta:-5-delta].mean()
    green_line = hist[-8-delta:-3-delta].mean()
    if abs(blue_line/red_line-1)<0.02 and abs(red_line/green_line-1)<0.02:
      return True
    else:
      return False

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

#通过比较碎形与红线位置,判断碎形是否有效
def is_effective_fractal(stock, direction):
    if is_fractal(stock,direction):
      hist = history(13,'1d','close',,df = False)
      red_line = hist[:-5].mean()
      close_price = hist[-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',,df = False)
    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',,df = False)
    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 None

#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',,df=False)
    if direction == 'up' and close_price > g.up_price:
      return True
    elif direction == 'down' and close_price < g.low_price:
      return True
    return False

#进场,初始仓位
def set_initial_position(stock,context):
    close_price = history(1,'1d','close',,df=False)
    g.amount = context.portfolio.cash/close_price/len(g.buy_stock)*3
    order(stock, g.amount)
    log.info("buying %s 股数为 %s"%(stock,g.amount))
    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))

# 计算股票前n日收益率
def security_return(days,security_code):
    hist1 = attribute_history(security_code, days + 1, '1d', 'close',df=False)
    security_returns = (hist1['close'][-1]-hist1['close'])/hist1['close']
    return security_returns

# 止损,根据前n日收益率
def conduct_nday_stoploss(context,security_code,days,bench):
    ifsecurity_return(days,security_code)<= bench:
      for stock in g.buy_stock:
            order_target_value(stock,0)
            log.info("Sell %s for stoploss" %stock)
      return True
    else:
      return False

# 计算股票累计收益率(从建仓至今)
def security_accumulate_return(context,data,stock):
    current_price = data.price
    cost = context.portfolio.positions.avg_cost
    if cost != 0:
      return (current_price-cost)/cost
    else:
      return None

# 个股止损,根据累计收益
def conduct_accumulate_stoploss(context,data,stock,bench):
    if security_accumulate_return(context,data,stock) != None\
    and security_accumulate_return(context,data,stock) < bench:
      order_target_value(stock,0)
      log.info("Sell %s for stoploss" %stock)
      return True
    else:
      return False

# 个股止盈,根据累计收益
def conduct_accumulate_stopwin(context,data,stock,bench):
    if security_accumulate_return(context,data,stock) != None\
    and security_accumulate_return(context,data,stock) > bench:
      order_target_value(stock,0)
      log.info("Sell %s for stopwin" %stock)
      return True
    else:
      return False

def handle_data(context,data):
    #大盘止损
    if conduct_nday_stoploss(context,'000300.XSHG',3,-0.03):
      return
    for stock in g.buy_stock:
      #个股止损
      if conduct_accumulate_stopwin(context,data,stock,0.3)\
      or conduct_accumulate_stoploss(context,data,stock,-0.1):
            return
      #计算AO,AC指标
      AC_index(stock)
      #空仓时,寻找机会入场
      if context.portfolio.positions.amount == 0:
            #计算向上碎形
            is_effective_fractal(stock,'high')
            #有效向上碎形存在,并被突破,买入
            if g.up_fractal_exists and active_fractal(stock,'up'):
                close_price = history(5, '1d', 'close', ,df = False)
                if is_up_going(g.AO_index,5)\
                and is_up_going(g.AC_index,3)\
                and is_up_going(close_price,2):
                  set_initial_position(stock,context)
      #有持仓时,加仓或离场
      else:
            #计算向下碎形
            is_effective_fractal(stock,'low')
            #出场条件1:有效向下碎形存在,并被突破,卖出
            if g.down_fractal_exists and active_fractal(stock,'down'):
                sell_all_stock(stock,context)
                return
            #出场条件2:
            #加仓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,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,2):
            #   adjust_position(stock,context,-0.1)



页: [1]
查看完整版本: 量化交易策略—鳄鱼法则交易系统股票策略