zoukankan      html  css  js  c++  java
  • 在聚宽平台上编写鳄鱼交易法则

    # 导入函数库
    import jqdata
    import numpy as np

    # 初始化函数,设定基准等等
    def initialize(context):
    set_option('use_real_price', True)
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    set_benchmark('000300.XSHG')

    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 = []
    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[stock] = 0
    g.low_price[stock] = 0
    g.up_fractal_exists[stock] = False
    g.down_fractal_exists[stock] = False #判断有效向下碎形
    g.AO_index[stock] = [0] #存放连续的AO指标数据
    g.cal_AC_index[stock] = [0] #计算AC指标中转存储
    g.AC_index[stock] = [0] #存放连续的AC指标数据
    g.amount[stock] = 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[stock][-21-delta:-8-delta].mean()
    red_line = hist[stock][-13-delta:-5-delta].mean()
    green_line = hist[stock][-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 = attribute_history(stock, 5, fields=[direction])
    if direction == 'high':
    if np.all(hist.iloc[:2] < hist.iloc[2]) and np.all(hist.iloc[3:] < hist.iloc[2]):
    g.up_price[stock] = hist.iloc[2].values
    return True
    elif direction == 'low':
    if np.all(hist.iloc[:2] > hist.iloc[2]) and np.all(hist.iloc[3:] > hist.iloc[2]):
    g.low_price[stock] = hist.iloc[2].values
    return True
    return False

    #通过比较碎形与红线位置,判断碎形是否有效
    def is_effective_fractal(stock, direction):
    if is_fractal(stock,direction):
    hist = attribute_history(stock, 11)
    red_line = hist['close'][:-3].mean()
    close_price = hist['close'][-1]
    if direction == 'high':
    if close_price > red_line:
    g.up_fractal_exists[stock] = True
    else:
    g.up_fractal_exists[stock] = False
    elif direction == 'low':
    if close_price < red_line:
    g.down_fractal_exists[stock] = True
    else:
    g.down_fractal_exists[stock] = 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[stock].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[stock]) >= 5:
    g.cal_AC_index[stock].append(g.AO_index[stock][-1] - np.array(g.AO_index[stock][-5:]).mean())
    if len(g.cal_AC_index[stock]) >=5:
    g.AC_index[stock].append(np.array(g.cal_AC_index[stock][-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[stock]:
    return True
    elif direction == 'down' and close_price < g.low_price[stock]:
    return True
    return False

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

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

    #加仓
    def adjust_position(stock,context,position):
    order(stock,g.amount[stock]*position)
    log.info("adjust position buying %s 股数为 %s"%(stock,g.amount[stock]*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'][0])/hist1['close'][0]
    return security_returns

    # 止损,根据前n日收益率
    def conduct_nday_stoploss(context,security_code,days,bench):
    if security_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[stock].price
    cost = context.portfolio.positions[stock].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[stock].amount == 0:
    #计算向上碎形
    is_effective_fractal(stock,'high')
    #有效向上碎形存在,并被突破,买入
    if g.up_fractal_exists and active_fractal(stock,'up'):
    close_price = history(5, '1d', 'close', [stock],df = False)
    if is_up_going(g.AO_index[stock],5)
    and is_up_going(g.AC_index[stock],3)
    and is_up_going(close_price[stock],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

  • 相关阅读:
    Codeforces Canda Cup 2016
    Codeforces Round #377(div 2)
    后缀数组专题
    Codeforces Round #375(div 2)
    Codeforces Round #374(div 2)
    [HDU5902]GCD is Funny(xjb搞)
    [HDU5904]LCIS(DP)
    HDU 1251统计难题
    POJ2104 K-TH NUMBER 传说中的主席树
    poj 3041
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/7423890.html
Copyright © 2011-2022 走看看