示例#1
0
def describe(params):
    i, j, k, l, candleTerm, cost, fileName, core = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = candleTerm
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    if core == 1:
        logging.info('================================')
        logging.info(
            'entryTerm:%s closeTerm:%s rangePercent:%s rangePercentTerm:%s rangeTerm:%s rangeTh:%s waitTerm:%s waitTh:%s',
            i[0], i[1], l[0], l[1], j[1], j[0], k[0], k[1])
    else:
        pass

    #テスト
    pl, profitFactor = channelBreakOut.describeResult()
    return [pl, profitFactor, i, l, j, k]
示例#2
0
def describe(params):
    i, j, k, l, candleTerm, cost, fileName = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = candleTerm
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    logging.info("===========Test pattern===========")
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s', channelBreakOut.rangeTerm,
                 channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s', channelBreakOut.waitTerm,
                 channelBreakOut.waitTh)
    logging.info("===========Backtest===========")
    pl, profitFactor = channelBreakOut.describeResult()
    logging.info("===========Assessment===========")
    return -pl
示例#3
0
def describe(params):
    i, j, k, l, candleTerm, cost, mlMode, fileName = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = candleTerm
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    logging.info("===========Test pattern===========")
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s', channelBreakOut.rangeTerm,
                 channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s', channelBreakOut.waitTerm,
                 channelBreakOut.waitTh)
    logging.info("===========Backtest===========")
    pl, profitFactor, maxLoss, winPer, ev, nOfTrade, winTotal, loseTotal = channelBreakOut.describeResult(
    )

    if "PFDD" in mlMode:
        result = profitFactor / maxLoss
    elif "PL" in mlMode:
        result = -pl
    elif "PF" in mlMode:
        result = -profitFactor
    elif "DD" in mlMode:
        result = maxLoss
    elif "WIN" in mlMode:
        result = -winPer
    elif "EV" in mlMode:
        result = -ev

    # 逆張り評価
    result = -result

    # 取引回数は裁定200は欲しい
    if nOfTrade < 200:
        result = 1

    logging.info("===========Assessment===========")
    logging.info('Result:%s', result)
    return result
示例#4
0
def describe(params):
    i, j, k, l, m, n, o, p, q, cost, fileName, core, useBlackList = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = str(m) + "T"
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    channelBreakOut.method = n
    channelBreakOut.price_range_limit = o
    channelBreakOut.tmp2 = p
    channelBreakOut.tmp1 = q
    if core == 1:
        logging.info('================================')
        logging.info(
            'entryTerm:%s closeTerm:%s rangePercent:%s rangePercentTerm:%s rangeTerm:%s rangeTh:%s waitTerm:%s waitTh:%s candleTerm:%s method:%s price_range_limit:%s tmp2:%s tmp1:%s',
            i[0], i[1], l[0], l[1], j[1], j[0], k[0], k[1], m, n, o, p, q)
    else:
        pass

    # ブラックリスト判定
    is_blacklist = False
    if useBlackList:
        bl = read_blacklist()
        co = bl.columns.values
        is_blacklist = ((bl[co[0]] == m) & (eq(bl[co[1]], i[0])) &
                        (eq(bl[co[2]], i[1])) & (eq(bl[co[3]], j[0])) &
                        (eq(bl[co[4]], j[1])) & (eq(bl[co[5]], k[1])) &
                        (eq(bl[co[6]], k[0])) & (eq(bl[co[7]], l[0])) &
                        (eq(bl[co[8]], l[1]))).any()

    if is_blacklist:
        pl = 0
        profitFactor = 0
    else:
        #テスト
        pl, profitFactor, maxLoss, winPer, ev, nOfTrade, winTotal, loseTotal = channelBreakOut.describeResult(
        )
    return [
        pl, profitFactor, i, l, j, k, m, n, o, p, q, is_blacklist, maxLoss,
        winPer, ev, nOfTrade, winTotal, loseTotal
    ]
示例#5
0
def optimization(candleTerm, cost, fileName, hyperopt, showTradeDetail):
    #optimizeList.jsonの読み込み
    f = open('optimizeList.json', 'r', encoding="utf-8")
    config = json.load(f)
    entryAndCloseTerm = config["entryAndCloseTerm"]
    rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
    waitTermAndwaitTh = config["waitTermAndwaitTh"]
    rangePercentList = config["rangePercentList"]
    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(
        waitTermAndwaitTh) * len(rangePercentList)

    logging.info('Total pattern:%s Searches:%s', total, hyperopt)
    logging.info("======Optimization start======")
    space = [
        hp.choice('i', entryAndCloseTerm),
        hp.choice('j', rangeThAndrangeTerm),
        hp.choice('k', waitTermAndwaitTh),
        hp.choice('l', rangePercentList), candleTerm, cost, fileName
    ]
    result = fmin(describe, space, algo=tpe.suggest, max_evals=hyperopt)

    logging.info("======Optimization finished======")
    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = entryAndCloseTerm[result['i']][0]
    channelBreakOut.closeTerm = entryAndCloseTerm[result['i']][1]
    channelBreakOut.rangeTh = rangeThAndrangeTerm[result['j']][0]
    channelBreakOut.rangeTerm = rangeThAndrangeTerm[result['j']][1]
    channelBreakOut.waitTerm = waitTermAndwaitTh[result['k']][0]
    channelBreakOut.waitTh = waitTermAndwaitTh[result['k']][1]
    channelBreakOut.rangePercent = rangePercentList[result['l']][0]
    channelBreakOut.rangePercentTerm = rangePercentList[result['l']][1]
    channelBreakOut.candleTerm = candleTerm
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    channelBreakOut.showTradeDetail = showTradeDetail
    logging.info("======Best pattern======")
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s', channelBreakOut.rangeTerm,
                 channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s', channelBreakOut.waitTerm,
                 channelBreakOut.waitTh)
    logging.info("======Backtest======")
    pl, profitFactor = channelBreakOut.describeResult()
def optimization(candleTerm, cost, fileName, core):
    #optimizeList.jsonの読み込み
    f = open('optimizeList.json', 'r')
    config = json.load(f)
    entryAndCloseTerm = config["entryAndCloseTerm"]
    rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
    waitTermAndwaitTh = config["waitTermAndwaitTh"]
    rangePercentList = config["rangePercentList"]
    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(
        waitTermAndwaitTh) * len(rangePercentList)

    paramList = []
    params = []
    for i, j, k, l in itertools.product(entryAndCloseTerm, rangeThAndrangeTerm,
                                        waitTermAndwaitTh, rangePercentList):
        params.append([i, j, k, l, candleTerm, cost, fileName, core])

    if core == 1:
        # 同期処理
        for param in params:
            result = describe(param)
            paramList.append(result)
            logging.info('[%s/%s]', len(paramList), total)
    else:
        # 非同期処理
        with ProcessPoolExecutor(max_workers=core) as executor:
            for result in executor.map(describe, params):
                paramList.append(result)
                logging.info('[%s/%s] result:%s', len(paramList), total,
                             paramList[-1])

    pF = [i[1] for i in paramList]
    pL = [i[0] for i in paramList]
    logging.info("======Optimization finished======")
    logging.info('Search pattern :%s', len(paramList))
    logging.info("Parameters:")
    logging.info(
        "(entryTerm, closeTerm), (rangePercent, rangePercentTerm), (rangeTh, rangeTerm), (waitTerm, waitTh)"
    )
    logging.info("ProfitFactor max:")
    logging.info(paramList[pF.index(max(pF))])
    logging.info("PL max:")
    logging.info(paramList[pL.index(max(pL))])
    message = "Optimization finished.\n ProfitFactor max:{}\n PL max:{}".format(
        paramList[pF.index(max(pF))], paramList[pL.index(max(pL))])
    channel.ChannelBreakOut().lineNotify(message)
示例#7
0
def describe(params):
    i, j, k, l, m, cost, mlMode, fileName = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = str(m) + "T"
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    logging.info("===========Test pattern===========")
    logging.info('candleTerm:%s', channelBreakOut.candleTerm)
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s', channelBreakOut.rangeTerm,
                 channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s', channelBreakOut.waitTerm,
                 channelBreakOut.waitTh)
    logging.info("===========Backtest===========")
    pl, profitFactor, maxLoss, winPer, ev = channelBreakOut.describeResult()

    if "PFDD" in mlMode:
        result = profitFactor / maxLoss
    elif "PL" in mlMode:
        result = -pl
    elif "PF" in mlMode:
        result = -profitFactor
    elif "DD" in mlMode:
        result = -maxLoss
    elif "WIN" in mlMode:
        result = -winPer
    elif "EV" in mlMode:
        result = -ev

    logging.info("===========Assessment===========")
    logging.info('Result:%s', result)
    return result
def describe(params):
    i, j, k, l, candleTerm, cost, fileName, core, useBlackList = params

    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = candleTerm
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    if core == 1:
        logging.info('================================')
        logging.info('entryTerm:%s closeTerm:%s rangePercent:%s rangePercentTerm:%s rangeTerm:%s rangeTh:%s waitTerm:%s waitTh:%s',i[0],i[1],l[0],l[1],j[1],j[0],k[0],k[1])
    else:
        pass

    # ブラックリスト判定
    is_blacklist = False
    if useBlackList:
        bl = read_blacklist()
        co = bl.columns.values
        is_blacklist = ((bl[co[0]] == candleTerm) &
                        (eq(bl[co[1]], i[0])) &
                        (eq(bl[co[2]], i[1])) &
                        (eq(bl[co[3]], j[0])) &
                        (eq(bl[co[4]], j[1])) &
                        (eq(bl[co[5]], k[1])) &
                        (eq(bl[co[6]], k[0])) &
                        (eq(bl[co[7]], l[0])) &
                        (eq(bl[co[8]], l[1]))).any()

    if is_blacklist:
        pl = 0
        profitFactor = 0
    else:
        #テスト
        pl, profitFactor, maxLoss, winPer = channelBreakOut.describeResult()
    return [pl, profitFactor, i, l, j, k, is_blacklist]
def optimization(candleTerm, cost, fileName):
    entryAndCloseTerm = [(2,2),(3,2),(2,3),(3,3),(4,2),(2,4),(4,3),(3,4),(4,4),(5,2),(2,5),(5,3),(3,5),(5,4),(4,5),(5,5),(10,10)]
    rangeThAndrangeTerm = [(None,3),(5000,3),(10000,3),(None,5),(5000,5),(10000,5),(None,10),(5000,10),(10000,10),(None,15),(5000,15),(10000,15),(None,None)]
    waitTermAndwaitTh = [(0,0),(3,10000),(3,15000),(3,20000),(5,10000),(5,15000),(5,20000),(10,10000),(10,15000),(10,20000),(15,10000),(15,15000),(15,20000)]
    rangePercentList = [(None,None),(1.5,5),(2,5),(2.5,5)]
    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(waitTermAndwaitTh) * len(rangePercentList)

    paramList = []
    for i in entryAndCloseTerm:
        for j in rangeThAndrangeTerm:
            for k in waitTermAndwaitTh:
                for l in rangePercentList:
                    channelBreakOut = channel.ChannelBreakOut()
                    channelBreakOut.entryTerm = i[0]
                    channelBreakOut.closeTerm = i[1]
                    channelBreakOut.rangeTh = j[0]
                    channelBreakOut.rangeTerm = j[1]
                    channelBreakOut.waitTerm = k[0]
                    channelBreakOut.waitTh = k[1]
                    channelBreakOut.rangePercent = l[0]
                    channelBreakOut.rangePercentTerm = l[1]
                    channelBreakOut.fileName = fileName
                    channelBreakOut.candleTerm = candleTerm
                    channelBreakOut.cost = cost
                    logging.info('================================')
                    logging.info('[%s/%s] entryTerm:%s closeTerm:%s rangePercent:%s rangePercentTerm:%s rangeTerm:%s rangeTh:%s waitTerm:%s waitTh:%s candleTerm:%s cost:%s',len(paramList)+1,total,i[0],i[1],l[0],l[1],j[1],j[0],k[0],k[1],candleTerm,cost)
                    #テスト
                    pl, profitFactor =  channelBreakOut.describeResult()
                    paramList.append([pl,profitFactor, i,l,j,k])

    pF = [i[1] for i in paramList]
    pL = [i[0] for i in paramList]
    logging.info("======Optimization finished======")
    logging.info('Search pattern :%s', len(paramList))
    logging.info("Parameters:")
    logging.info("(entryTerm, closeTerm), (rangePercent, rangePercentTerm), (rangeTh, rangeTerm), (waitTerm, waitTh)")
    logging.info("ProfitFactor max:")
    logging.info(paramList[pF.index(max(pF))])
    logging.info("PL max:")
    logging.info(paramList[pL.index(max(pL))])
    message = "Optimization finished.\n ProfitFactor max:{}\n PL max:{}".format(paramList[pF.index(max(pF))], paramList[pL.index(max(pL))])
    channelBreakOut.lineNotify(message)
示例#10
0
def optimization(cost, fileName, hyperopt, mlMode, showTradeDetail):
    #optimizeList.jsonの読み込み
    f = open('config/optimizeList.json', 'r', encoding="utf-8")
    config = json.load(f)
    entryAndCloseTerm = config["entryAndCloseTerm"]
    rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
    waitTermAndwaitTh = config["waitTermAndwaitTh"]
    rangePercentList = config["rangePercentList"]
    linePattern = config["linePattern"]
    termUpper = config["termUpper"]
    candleTerm  = config["candleTerm"]

    if "COMB" in linePattern:
        entryAndCloseTerm = list(itertools.product(range(2,termUpper), range(2,termUpper)))

    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(waitTermAndwaitTh) * len(rangePercentList) * len(candleTerm)

    logging.info('Total pattern:%s Searches:%s',total,hyperopt)
    logging.info("======Optimization start======")
    #hyperoptによる最適値の算出
    space = [hp.choice('i',entryAndCloseTerm), hp.choice('j',rangeThAndrangeTerm), hp.choice('k',waitTermAndwaitTh), hp.choice('l',rangePercentList), hp.choice('m',candleTerm), cost, mlMode, fileName]
    result = fmin(describe,space,algo=tpe.suggest,max_evals=hyperopt)

    logging.info("======Optimization finished======")
    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = entryAndCloseTerm[result['i']][0]
    channelBreakOut.closeTerm = entryAndCloseTerm[result['i']][1]
    channelBreakOut.rangeTh = rangeThAndrangeTerm[result['j']][0]
    channelBreakOut.rangeTerm = rangeThAndrangeTerm[result['j']][1]
    channelBreakOut.waitTerm = waitTermAndwaitTh[result['k']][0]
    channelBreakOut.waitTh = waitTermAndwaitTh[result['k']][1]
    channelBreakOut.rangePercent = rangePercentList[result['l']][0]
    channelBreakOut.rangePercentTerm = rangePercentList[result['l']][1]
    channelBreakOut.candleTerm = str(candleTerm[result['m']]) + "T"
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    channelBreakOut.showTradeDetail = showTradeDetail
    logging.info("======Best pattern======")
    logging.info('candleTerm:%s mlMode:%s',channelBreakOut.candleTerm,mlMode)
    logging.info('entryTerm:%s closeTerm:%s',channelBreakOut.entryTerm,channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',channelBreakOut.rangePercent,channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s',channelBreakOut.rangeTerm,channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s',channelBreakOut.waitTerm,channelBreakOut.waitTh)
    logging.info("======Backtest======")
    channelBreakOut.describeResult()

    #config.json設定用ログ
    print("======config======")
    print("    \"entryTerm\" : ", channelBreakOut.entryTerm, ",", sep="")
    print("    \"closeTerm\" : ", channelBreakOut.closeTerm, ",", sep="")
    if channelBreakOut.rangePercent is None:
        print("    \"rangePercent\" : ", "null,", sep="")
    else:
        print("    \"rangePercent\" : ", channelBreakOut.rangePercent, ",", sep="")
    if channelBreakOut.rangePercentTerm is None:
        print("    \"rangePercentTerm\" : ", "null,", sep="")
    else:
        print("    \"rangePercentTerm\" : ", channelBreakOut.rangePercentTerm, ",", sep="")
    if channelBreakOut.rangeTerm is None:
        print("    \"rangeTerm\" : ", "null,", sep="")
    else:
        print("    \"rangeTerm\" : ", channelBreakOut.rangeTerm, ",", sep="")
    if channelBreakOut.rangeTh is None:
        print("    \"rangeTh\" : ", "null,", sep="")
    else:
        print("    \"rangeTh\" : ", channelBreakOut.rangeTh, ",", sep="")
    print("    \"waitTerm\" : ", channelBreakOut.waitTerm, ",", sep="")
    print("    \"waitTh\" : ", channelBreakOut.waitTh, ",", sep="")
    print("    \"candleTerm\" : \"", channelBreakOut.candleTerm, "\",", sep="")
    print("==================")
def optimization(cost, fileName, core, useBlackList):
    #optimizeList.jsonの読み込み
    f = open('config/optimizeList.json', 'r', encoding="utf-8")
    config = json.load(f)
    entryAndCloseTerm = config["entryAndCloseTerm"]
    rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
    waitTermAndwaitTh = config["waitTermAndwaitTh"]
    rangePercentList = config["rangePercentList"]
    linePattern = config["linePattern"]
    termUpper = config["termUpper"]
    candleTerm = config["candleTerm"]

    if "COMB" in linePattern:
        entryAndCloseTerm = list(
            itertools.product(range(2, termUpper), range(2, termUpper)))

    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(
        waitTermAndwaitTh) * len(rangePercentList) * len(candleTerm)

    paramList = []
    params = []
    for i, j, k, l, m in itertools.product(entryAndCloseTerm,
                                           rangeThAndrangeTerm,
                                           waitTermAndwaitTh, rangePercentList,
                                           candleTerm):
        params.append([i, j, k, l, m, cost, fileName, core, useBlackList])

    black_list = read_blacklist()
    if core == 1:
        # 同期処理
        for param in params:
            result = describe(param)
            paramList.append(result)
            logging.info('[%s/%s]', len(paramList), total)
    else:
        # 非同期処理
        with ProcessPoolExecutor(max_workers=core) as executor:
            for result in executor.map(describe, params):
                skiped = '(skip)' if result[7] == True else ''
                paramList.append(result)
                logging.info('[%s/%s] result%s:%s', len(paramList), total,
                             skiped, paramList[-1])
                # ブラックリスト追加
                if (useBlackList == True) & (result[0] < 0) & (result[7]
                                                               == False):
                    new_bl = pd.DataFrame([[
                        result[6], result[2][0], result[2][1], result[4][0],
                        result[4][1], result[5][1], result[5][0], result[3][0],
                        result[3][1]
                    ]],
                                          columns=black_list.columns.values)
                    black_list = black_list.append(new_bl)
    # ブラックリスト書き込み
    if useBlackList: black_list.to_csv('blacklist.csv', index=False, sep=',')

    pF = [i[1] for i in paramList]
    pL = [i[0] for i in paramList]
    logging.info("======Optimization finished======")
    logging.info('Search pattern :%s', len(paramList))
    logging.info("Parameters:")
    logging.info(
        "[entryTerm, closeTerm], [rangePercent, rangePercentTerm], [rangeTh, rangeTerm], [waitTerm, waitTh], [candleTerm]"
    )
    logging.info("ProfitFactor max:")
    logging.info(paramList[pF.index(max(pF))])
    logging.info("PL max:")
    logging.info(paramList[pL.index(max(pL))])
    message = "Optimization finished.\n ProfitFactor max:{}\n PL max:{}".format(
        paramList[pF.index(max(pF))], paramList[pL.index(max(pL))])
    channel.ChannelBreakOut().lineNotify(message)

    #config.json設定用ログ
    print("*********PF max*********")
    print("PL", paramList[pF.index(max(pF))][0])
    print("PF", paramList[pF.index(max(pF))][1])
    print("    \"entryTerm\" : ",
          paramList[pF.index(max(pF))][2][0],
          ",",
          sep="")
    print("    \"closeTerm\" : ",
          paramList[pF.index(max(pF))][2][1],
          ",",
          sep="")
    if paramList[pF.index(max(pF))][3][0] is None:
        print("    \"rangePercent\" : ", "null,", sep="")
    else:
        print("    \"rangePercent\" : ",
              paramList[pF.index(max(pF))][3][0],
              ",",
              sep="")
    if paramList[pF.index(max(pF))][3][1] is None:
        print("    \"rangePercentTerm\" : ", "null,", sep="")
    else:
        print("    \"rangePercentTerm\" : ",
              paramList[pF.index(max(pF))][3][1],
              ",",
              sep="")
    if paramList[pF.index(max(pF))][4][1] is None:
        print("    \"rangeTerm\" : ", "null,", sep="")
    else:
        print("    \"rangeTerm\" : ",
              paramList[pF.index(max(pF))][4][1],
              ",",
              sep="")
    if paramList[pF.index(max(pF))][4][0] is None:
        print("    \"rangeTh\" : ", "null,", sep="")
    else:
        print("    \"rangeTh\" : ",
              paramList[pF.index(max(pF))][4][0],
              ",",
              sep="")
    print("    \"waitTerm\" : ",
          paramList[pF.index(max(pF))][5][0],
          ",",
          sep="")
    print("    \"waitTh\" : ", paramList[pF.index(max(pF))][5][1], ",", sep="")
    print("    \"candleTerm\" : \"",
          paramList[pF.index(max(pF))][6],
          "T\",",
          sep="")

    print("*********PL max*********")
    print("PL", paramList[pL.index(max(pL))][0])
    print("PF", paramList[pL.index(max(pL))][1])
    print("    \"entryTerm\" : ",
          paramList[pL.index(max(pL))][2][0],
          ",",
          sep="")
    print("    \"closeTerm\" : ",
          paramList[pL.index(max(pL))][2][1],
          ",",
          sep="")
    if paramList[pL.index(max(pL))][3][0] is None:
        print("    \"rangePercent\" : ", "null,", sep="")
    else:
        print("    \"rangePercent\" : ",
              paramList[pL.index(max(pL))][3][0],
              ",",
              sep="")
    if paramList[pL.index(max(pL))][3][1] is None:
        print("    \"rangePercentTerm\" : ", "null,", sep="")
    else:
        print("    \"rangePercentTerm\" : ",
              paramList[pL.index(max(pL))][3][1],
              ",",
              sep="")
    if paramList[pL.index(max(pL))][4][1] is None:
        print("    \"rangeTerm\" : ", "null,", sep="")
    else:
        print("    \"rangeTerm\" : ",
              paramList[pL.index(max(pL))][4][1],
              ",",
              sep="")
    if paramList[pL.index(max(pL))][4][0] is None:
        print("    \"rangeTh\" : ", "null,", sep="")
    else:
        print("    \"rangeTh\" : ",
              paramList[pL.index(max(pL))][4][0],
              ",",
              sep="")
    print("    \"waitTerm\" : ",
          paramList[pL.index(max(pL))][5][0],
          ",",
          sep="")
    print("    \"waitTh\" : ", paramList[pL.index(max(pL))][5][1], ",", sep="")
    print("    \"candleTerm\" : \"",
          paramList[pF.index(max(pF))][6],
          "T\",",
          sep="")
示例#12
0
                        datefmt='%Y-%m-%d %H:%M:%S')
    logfile = logging.handlers.TimedRotatingFileHandler(
        filename='log/trade.log', when='midnight')
    logfile.setLevel(logging.INFO)
    logfile.setFormatter(
        logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s',
                          datefmt='%Y-%m-%d %H:%M:%S'))
    logging.getLogger('').addHandler(logfile)
    logging.info('Wait...')

    #config.jsonの読み込み
    f = open('config.json', 'r', encoding="utf-8")
    config = json.load(f)

    #channelBreakOut設定値
    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.lot = config["lotSize"]
    channelBreakOut.entryTerm = config["entryTerm"]
    channelBreakOut.closeTerm = config["closeTerm"]
    channelBreakOut.rangePercent = config["rangePercent"]
    channelBreakOut.rangePercentTerm = config["rangePercentTerm"]
    channelBreakOut.rangeTerm = config["rangeTerm"]
    channelBreakOut.rangeTh = config["rangeTh"]
    channelBreakOut.waitTerm = config["waitTerm"]
    channelBreakOut.waitTh = config["waitTh"]
    channelBreakOut.candleTerm = config["candleTerm"]
    channelBreakOut.fileName = None

    # 約定履歴ファイルを引き継がない場合は削除
    if config["keepPosition"] == False:
        try:
def describe(params):
    # パラメータごとに呼ばれる

    i, j, k, l, m, cost, mlMode, fileName, n, o, p, q, r, s, t = params

    # ファイル読み込みは最初の1回だけ
    global channelBreakOut
    if channelBreakOut:
        pass
    else:
        channelBreakOut = channel.ChannelBreakOut()
        # channelBreakOut = maCross.MACross()

    channelBreakOut.entryTerm = i[0]
    channelBreakOut.closeTerm = i[1]
    channelBreakOut.rangeTh = j[0]
    channelBreakOut.rangeTerm = j[1]
    channelBreakOut.waitTerm = k[0]
    channelBreakOut.waitTh = k[1]
    channelBreakOut.rangePercent = l[0]
    channelBreakOut.rangePercentTerm = l[1]
    channelBreakOut.candleTerm = str(m) + "T"
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    channelBreakOut.method = n
    channelBreakOut.price_range_limit = o
    channelBreakOut.tmp2 = p
    channelBreakOut.tmp1 = q
    channelBreakOut.filtter_param = r
    channelBreakOut.filtter = s
    channelBreakOut.offset_raitio = t
    channelBreakOut.showFigure = False

    logging.info("===========Test pattern===========")
    logging.info('fileName:%s', channelBreakOut.fileName)
    logging.info('method:%s', channelBreakOut.method)
    logging.info('candleTerm:%s', channelBreakOut.candleTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('gyakubari:%s', channelBreakOut.gyakubari)
    logging.info('filtter_param:%s', channelBreakOut.filtter_param)
    logging.info('tmp1:%s', channelBreakOut.tmp1)
    logging.info('tmp2:%s', channelBreakOut.tmp2)
    logging.info('cost:%s', channelBreakOut.cost)
    logging.info('filtter:%s', channelBreakOut.filtter)
    logging.info('mlMode:%s', mlMode)
    logging.info('trailingStop:%s', channelBreakOut.trailingStop)
    logging.info('offset_raitio:%s', channelBreakOut.offset_raitio)
    logging.info("===========Backtest===========")
    channelBreakOut.readFile()
    channelBreakOut.calcPriceRange()

    pl, profitFactor, maxLoss, winPer, ev, nOfTrade, winTotal, loseTotal = channelBreakOut.describeResult(
    )

    a = None
    b = None
    if "PFDD" in mlMode:
        result = profitFactor / maxLoss
    elif "PL" in mlMode:
        result = -pl
    elif "PF" in mlMode:
        result = -profitFactor
    elif "DD" in mlMode:
        result = maxLoss
    elif "WIN" in mlMode:
        result = -winPer
    elif "EV" in mlMode:
        result = -ev
    elif "winTotal" in mlMode:
        result = -winTotal
    elif "SAITO":
        if nOfTrade / channelBreakOut.nissuu < 1:
            a = nOfTrade / channelBreakOut.nissuu * nOfTrade / channelBreakOut.nissuu
        else:
            a = math.sqrt(
                math.sqrt(math.sqrt(nOfTrade / channelBreakOut.nissuu))) / 5

        if channelBreakOut.candleTerm == "1T":
            b = profitFactor
        elif channelBreakOut.candleTerm == "5T":
            b = math.sqrt(profitFactor)
        elif channelBreakOut.candleTerm == "15T":
            b = math.sqrt(math.sqrt(profitFactor))

        result = -(pl / channelBreakOut.nissuu / 5000 + a + b)

    logging.info("===========Assessment===========")
    logging.info('1day pl:%s', pl / channelBreakOut.nissuu / 5000)
    logging.info('1day trade:%s', a)
    logging.info('PF:%s', b)
    logging.info('Result:%s', result)
    return result
def optimization(cost, fileName, hyperopt, mlMode, showTradeDetail):
    #optimizeList.jsonの読み込み
    f = open('config/optimizeList.json', 'r', encoding="utf-8")
    config = json.load(f)
    entryAndCloseTerm = config["entryAndCloseTerm"]
    rangeThAndrangeTerm = config["rangeThAndrangeTerm"]
    waitTermAndwaitTh = config["waitTermAndwaitTh"]
    rangePercentList = config["rangePercentList"]
    linePattern = config["linePattern"]
    termUpper = config["termUpper"]
    candleTerm = config["candleTerm"]
    method = config["method"]
    price_range_limit = config["price_range_limit"]
    tmp2 = config["tmp2"]
    tmp1 = config["tmp1"]
    filtter_param = config["filtter_param"]
    filtter = config["filtter"]
    trailingStop = config["trailingStop"]
    offset_raitio = config["offset_raitio"]

    if "COMB" in linePattern:
        if trailingStop == 'True':
            # クローズロジックないので1に固定
            entryAndCloseTerm = list(
                itertools.product(range(2, termUpper[0], 2), range(2, 3)))
        else:
            entryAndCloseTerm = list(
                itertools.product(range(2, termUpper[0], 2),
                                  range(2, termUpper[1], 2)))

        entryAndCloseTerm = [i for i in entryAndCloseTerm if i[0] >= i[1]]

    total = len(entryAndCloseTerm) * len(rangeThAndrangeTerm) * len(
        waitTermAndwaitTh) * len(rangePercentList) * len(candleTerm) * len(
            method) * len(price_range_limit) * len(tmp2) * len(tmp1) * len(
                filtter_param) * len(filtter) * len(offset_raitio)

    logging.info('Total pattern:%s Searches:%s', total, hyperopt)
    logging.info("======Optimization start======")
    #hyperoptによる最適値の算出
    space = [
        hp.choice('i', entryAndCloseTerm),
        hp.choice('j', rangeThAndrangeTerm),
        hp.choice('k', waitTermAndwaitTh),
        hp.choice('l', rangePercentList),
        hp.choice('m', candleTerm), cost, mlMode, fileName,
        hp.choice('n', method),
        hp.choice('o', price_range_limit),
        hp.choice('p', tmp2),
        hp.choice('q', tmp1),
        hp.choice('r', filtter_param),
        hp.choice('s', filtter),
        hp.choice('t', offset_raitio)
    ]
    result = fmin(describe, space, algo=tpe.suggest, max_evals=hyperopt)

    logging.info("======Optimization finished======")
    channelBreakOut = channel.ChannelBreakOut()
    channelBreakOut.entryTerm = entryAndCloseTerm[result['i']][0]
    channelBreakOut.closeTerm = entryAndCloseTerm[result['i']][1]
    channelBreakOut.rangeTh = rangeThAndrangeTerm[result['j']][0]
    channelBreakOut.rangeTerm = rangeThAndrangeTerm[result['j']][1]
    channelBreakOut.waitTerm = waitTermAndwaitTh[result['k']][0]
    channelBreakOut.waitTh = waitTermAndwaitTh[result['k']][1]
    channelBreakOut.rangePercent = rangePercentList[result['l']][0]
    channelBreakOut.rangePercentTerm = rangePercentList[result['l']][1]
    channelBreakOut.candleTerm = str(candleTerm[result['m']]) + "T"
    channelBreakOut.cost = cost
    channelBreakOut.fileName = fileName
    channelBreakOut.showTradeDetail = showTradeDetail
    logging.info("======Best pattern======")
    logging.info('candleTerm:%s mlMode:%s', channelBreakOut.candleTerm, mlMode)
    logging.info('entryTerm:%s closeTerm:%s', channelBreakOut.entryTerm,
                 channelBreakOut.closeTerm)
    logging.info('rangePercent:%s rangePercentTerm:%s',
                 channelBreakOut.rangePercent,
                 channelBreakOut.rangePercentTerm)
    logging.info('rangeTerm:%s rangeTh:%s', channelBreakOut.rangeTerm,
                 channelBreakOut.rangeTh)
    logging.info('waitTerm:%s waitTh:%s', channelBreakOut.waitTerm,
                 channelBreakOut.waitTh)
    logging.info("======Backtest======")
    channelBreakOut.describeResult()

    #config.json設定用ログ
    print("======config======")
    print("    \"entryTerm\" : ", channelBreakOut.entryTerm, ",", sep="")
    print("    \"closeTerm\" : ", channelBreakOut.closeTerm, ",", sep="")
    if channelBreakOut.rangePercent is None:
        print("    \"rangePercent\" : ", "null,", sep="")
    else:
        print("    \"rangePercent\" : ",
              channelBreakOut.rangePercent,
              ",",
              sep="")
    if channelBreakOut.rangePercentTerm is None:
        print("    \"rangePercentTerm\" : ", "null,", sep="")
    else:
        print("    \"rangePercentTerm\" : ",
              channelBreakOut.rangePercentTerm,
              ",",
              sep="")
    if channelBreakOut.rangeTerm is None:
        print("    \"rangeTerm\" : ", "null,", sep="")
    else:
        print("    \"rangeTerm\" : ", channelBreakOut.rangeTerm, ",", sep="")
    if channelBreakOut.rangeTh is None:
        print("    \"rangeTh\" : ", "null,", sep="")
    else:
        print("    \"rangeTh\" : ", channelBreakOut.rangeTh, ",", sep="")
    print("    \"waitTerm\" : ", channelBreakOut.waitTerm, ",", sep="")
    print("    \"waitTh\" : ", channelBreakOut.waitTh, ",", sep="")
    print("    \"candleTerm\" : \"", channelBreakOut.candleTerm, "\",", sep="")
    print("==================")