Esempio n. 1
0
def create_first_chart():
    print("log file not found: try to fetch")
    strategy = settings["Strategy"]
    deltaDays = settings['deltaDays']
    filename = settings['configFilename']
    configjs = Settings.get_configjs(filename)
    watch = settings["watch"]
    dateset = gekkoWrapper.getAvailableDataset(watch)
    daterange = coreFunctions.getRandomDateRange(dateset, deltaDays=deltaDays)
    config = evolution_bayes.compressing_flatten_dict(configjs[strategy],
                                                      strategy)
    config["watch"] = watch
    gekko_config = gekkoWrapper.createConfig(config, daterange)
    res = evolution_bayes.EvaluateRaw(watch, daterange, configjs[strategy],
                                      strategy)
    score = res['report']['relativeProfit']

    filename = "_".join([
        watch["exchange"], watch["currency"], watch["asset"], strategy,
        datetime.datetime.now().strftime('%Y%m%d_%H%M%S'),
        str(score)
    ])
    save_dir = settings["save_dir"]
    json_filename = os.path.join(save_dir, filename) + "_config.json"
    json2_filename = os.path.join(save_dir, filename) + "_response.json"
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    f = open(json_filename, "w")
    f.write(json.dumps(gekko_config, indent=2))
    f.close()
    print("Saved: " + json_filename)
    f = open(json2_filename, "w")
    f.write(json.dumps(res, indent=2))
    f.close()
    print("Saved: " + json2_filename)
Esempio n. 2
0
def create_first_chart():
    print("log file not found: try to fetch")
    strategy = settings["Strategy"]
    deltaDays = settings['deltaDays']
    filename = gsettings['configFilename']
    configjs = Settings.get_configjs(filename)
    watch = settings["watch"]
    dateset = gekkoWrapper.getAvailableDataset(watch)
    daterange = coreFunctions.getRandomDateRange(dateset, deltaDays=deltaDays)
    config = evolution_bayes.compressing_flatten_dict(configjs[strategy], strategy)
    config["watch"] = watch
    gekko_config = gekkoWrapper.createConfig(config, daterange)
    res = evolution_bayes.EvaluateRaw(watch, daterange, configjs[strategy], strategy)
    score = res['report']['relativeProfit']

    filename = "_".join([watch["exchange"], watch["currency"], watch["asset"], strategy, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'), str(score)])
    save_dir = gsettings["save_dir"]
    json_filename = os.path.join(save_dir, filename) + "_config.json"
    json2_filename = os.path.join(save_dir, filename) + "_response.json"
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    f = open(json_filename, "w")
    f.write(json.dumps(gekko_config, indent=2))
    f.close()
    print("Saved: " + json_filename)
    f = open(json2_filename, "w")
    f.write(json.dumps(res, indent=2))
    f.close()
    print("Saved: " + json2_filename)
Esempio n. 3
0
def evaluate_random(i):
    global params
    watch = settings["watch"]
    chosenRange = getAvailableDataset(watch)
    DateRange = getRandomDateRange(chosenRange,
                                   deltaDays=settings['deltaDays'])
    if "candleSize" in settings[Strategy]:
        return EvaluateRaw(watch, DateRange, params,
                           settings['Strategy'])["report"]["trades"]
    else:
        return Evaluate(watch, DateRange, params, settings['Strategy'])
Esempio n. 4
0
def show_chart():
    strategy = settings["Strategy"]
    deltaDays = settings['deltaDays']
    filename = settings['configFilename']
    configjs = Settings.get_configjs(filename)
    watch = settings["watch"]
    dateset = gekkoWrapper.getAvailableDataset(watch)
    daterange = coreFunctions.getRandomDateRange(dateset, deltaDays=deltaDays)
    res = evolution_bayes.EvaluateRaw(watch, daterange, configjs[strategy], strategy)
    #res = gekkoWrapper.httpPost(URL, gekkoConfig)

    show_candles(res, configjs[strategy])
def gekko_generations(Strategy, NBEPOCH=300, POP_SIZE=30):
    # SETTINGS;############################
    settings=getSettings()['generations']

    DRP = 10 # Date range persistence; Number of subsequent rounds
             # until another time range in dataset is selected;
    _lambda  = 5 # size of offspring generated per epoch;
    cxpb, mutpb = 0.2, 0.8 # Probabilty of crossover and mutation respectively;
    deltaDays=21 # time window of dataset for evaluation
    n_ParallelBacktests = 5
    #######################################
    parallel = Pool(n_ParallelBacktests)
    
    toolbox = base.Toolbox()
    creator.create("FitnessMax", base.Fitness, weights=(1.0,))
    creator.create("Criterion", list,
                   fitness=creator.FitnessMax, Strategy=Strategy)
    toolbox.register("newCriterion", initInd, creator.Criterion)
    
    toolbox.register("population", tools.initRepeat, list,  toolbox.newCriterion)

    toolbox.register("map", progrBarMap)
    
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutUniformInt, low=10, up=10, indpb=0.2)
    
    POP = toolbox.population(n=POP_SIZE)
    W=0
    availableDataRange = getAvailableDataset()
    print("using candlestick dataset %s" % availableDataRange)
    print("%s strategy;" % Strategy)
    
    InfoData={}
    
    #firePaperTrader(reconstructTradeSettings(POP[0], POP[0].Strategy), "poloniex",
    #                "USDT", "BTC")
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", np.mean)
    stats.register("std", np.std)
    stats.register("min", np.min)
    stats.register("max", np.max)

    InitialBestScores, FinalBestScores = [], []
    FirstEpochOfDataset = False
    Stats = None
    settings_debug_min = reconstructTradeSettings([0 for x in range(10)], 'MIN_ VALUES')
    settings_debug_max = reconstructTradeSettings([100 for x in range(10)], 'MAX_ VALUES')
    
    print("DEBUG %s" % json.dumps(settings_debug_min, indent=2))
    print("DEBUG %s" % json.dumps(settings_debug_max, indent=2))
          
    while W < NBEPOCH: 
        HallOfFame = tools.HallOfFame(30)
        bestScore = 0
        Deviation = 0
        
        Z = not W % DRP and bestScore > 0.3 and not Deviation
        K = not W % (DRP*3)
        if Z or K: # SELECT NEW DATERANGE;
            if W:# SEND BEST IND TO HoF;
                BestSetting = tools.selBest(POP, 1)[0]
                HallOfFame.insert(BestSetting)
                #print(InfoData)
                #plotEvolutionSummary(InfoData,
                #                     "evolution_%s"% (Strategy))
                FinalBestScores.append(Stats['max'])
            DateRange = getRandomDateRange(availableDataRange, deltaDays)
            print("Loading new date range;")
            print("\t%s to %s" % (DateRange['from'], DateRange['to']))
            for I in range(len(POP)):
                del POP[I].fitness.values
            toolbox.register("evaluate", Evaluate, DateRange)
            FirstEpochOfDataset = True
            
        if random.random() < 0.2 and HallOfFame.items:
            # casually insert individuals from HallOfFame on population;
            for Q in range(1):
                CHP = deepcopy(random.choice(HallOfFame))
                del CHP.fitness.values
                POP += [CHP]

        if random.random() < 0.5:
            # should have built the wall;
            nb = random.randint(1,9)
            POP += toolbox.population(nb)
            
        individues_to_simulate = [ind for ind in POP if not ind.fitness.valid]
        #fitnesses = toolbox.map(toolbox.evaluate, individues_to_simulate)
        to_simulation = [ (x[:], x.Strategy) for x in individues_to_simulate ]
        fitnesses = parallel.starmap(toolbox.evaluate, to_simulation)
        
        for ind, fit in zip(individues_to_simulate, fitnesses):
            ind.fitness.values = fit

        # get proper evolution statistics; #TBD
        Stats=stats.compile(POP)


            

        # show information;
        print("EPOCH %i/%i" % (W, NBEPOCH)) 
        print("Average profit %.3f%%\tDeviation %.3f" % (Stats['avg'],Stats['std']))
        print("Maximum profit %.3f%%\tMinimum profit %.3f%%" % (Stats['max'],Stats['min']))
        print("")

        # log statistcs;
        InfoData[W] = Stats
        if FirstEpochOfDataset:
            InitialBestScores.append(Stats['max'])
            FirstEpochOfDataset = False
            
        bestScore = Stats['max']
        Deviation = Stats['std']
        # generate and append offspring in population;
        offspring = algorithms.varOr(POP, toolbox, settings['_lambda'],
                                     settings['cxpb'], settings['mutpb'])

        POP[:] = tools.selBest(POP+offspring, POP_SIZE)

        #print("POPSIZE %i" % len(POP))
        W+=1

    # RUN ENDS. SELECT INDIVIDUE, LOG AND PRINT STUFF;
    FinalBestScores.append(Stats['max'])
    FinalIndividue = tools.selBest(POP, 1)[0]
    FinalIndividueSettings = reconstructTradeSettings(FinalIndividue,
                                                      FinalIndividue.Strategy)
    Show = json.dumps(FinalIndividueSettings, indent=2)
    logInfo("~" * 18)
    for S in range(len(FinalBestScores)):
        logInfo("Candlestick Set %i: \n\n" % (S+1)+\
                "EPOCH ONE BEST PROFIT: %.3f\n" % InitialBestScores[S] +\
                "FINAL EPOCH BEST PROFIT: %.3f\n" % FinalBestScores[S])

        
    print("Settings for Gekko config.js:")
    print(Show)
    print("Settings for Gekko --ui webpage")
    logInfo(pasteSettingsToUI(FinalIndividueSettings))

    print("\nRemember to check MAX and MIN values for each parameter.")
    print("\tresults may improve with extended ranges.")
    
    print("Testing Strategy:\n")
    Vv=stratSettingsProofOfViability(FinalIndividueSettings, availableDataRange)
    Vv = "GOOD STRAT" if Vv else "SEEMS BAD"
    logInfo(Vv)
    print("\t\t.RUN ENDS.")