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]
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
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
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 ]
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)
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)
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="")
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("==================")