VeighNa量化社区
你的开源社区量化交易平台
Member
加入于:
帖子: 22
声望: 1

请教大神,randrange()只能整数,参数是非整数的怎么办?

Member
加入于:
帖子: 158
声望: 71

玩游戏 wrote:

请教大神,randrange()只能整数,参数是非整数的怎么办?

我是用random.uniform(begin, end), 返回begin,end直接随机非整数。
或者你可以直接randrange()/10.0 也可以。。。

Member
加入于:
帖子: 22
声望: 1

谢谢,随机非整数会不会耗时太长或者结果比较意外?

Member
加入于:
帖子: 22
声望: 1

另外请教不改任何的情况下每次执行出来的输出优化参数结果不一样,这个是什么原因呢?

还有,我把输出优化参数结果拿回去跑回测,回测结果也和优化结果不一样。
完全晕掉了

Member
加入于:
帖子: 158
声望: 71

玩游戏 wrote:

另外请教不改任何的情况下每次执行出来的输出优化参数结果不一样,这个是什么原因呢?

还有,我把输出优化参数结果拿回去跑回测,回测结果也和优化结果不一样。
完全晕掉了

每次不一样是可以理解,族群要更多,还有进化次数也要更多,最好会一个差不多的接近的参数范围。

回测结果应该一样的,不过我用的是按次统计的,用按天统计我总是出现极端值。

Member
加入于:
帖子: 22
声望: 1

张国平 wrote:

玩游戏 wrote:

另外请教不改任何的情况下每次执行出来的输出优化参数结果不一样,这个是什么原因呢?

还有,我把输出优化参数结果拿回去跑回测,回测结果也和优化结果不一样。
完全晕掉了

每次不一样是可以理解,族群要更多,还有进化次数也要更多,最好会一个差不多的接近的参数范围。

回测结果应该一样的,不过我用的是按次统计的,用按天统计我总是出现极端值。
谢谢指点。我用40代进化比100代的结果还好,如果这样是否就无法像穷举法那样得到最优解?

Member
avatar
加入于:
帖子: 187
声望: 55

基于@张国平 平总的遗传算法做了一些改动,虽然实现了多进程,但是无法使用到LRU_cache修饰器避免重复计算。而另一版本确是用到了LRU_cache, 但是在多进程中遇到了数据传入问题。暂无法兼容二者。希望大家能提供一些思路。

 

下面代码是多进程版本遗传算法,放在lru_cache在类里面,导致其功能无法使用。(基于vnpy2.0 回测引擎)

# encoding: UTF-8
"""
"""
from vnpy.app.cta_strategy import BacktestingEngine, OptimizationSetting
from vnpy.app.cta_strategy.strategies.boll_channel_strategy import BollChannelStrategy

import random
import numpy as np
from deap import creator, base, tools, algorithms
import multiprocessing
from time import time
import datetime
from functools import lru_cache


class GeneticOptimizeStrategy(object):

    def __init__(self):
        self.settings_ga = []
        self.s = OptimizationSetting()
        self.back = BacktestingEngine()
        self.settings_param = {}

    creator.create("FitnessMulti", base.Fitness, weights=(1.0, 1.0)) 
    creator.create("Individual", list, fitness=creator.FitnessMulti)

    def backtesting_setting(self, vt_symbol, interval, start, end, rate, slippage, size, pricetick, capital, strategy, target_1, target_2):
        self.settings_param["vt_symbol"] = vt_symbol
        self.settings_param["interval"] = interval
        self.settings_param["start"] = start
        self.settings_param["end"] = end
        self.settings_param["rate"] = rate
        self.settings_param["slippage"] = slippage
        self.settings_param["size"] = size
        self.settings_param["pricetick"] = pricetick
        self.settings_param["capital"] = capital
        self.settings_param["strategy"] = strategy
        self.settings_param["target_1"] = target_1
        self.settings_param["target_2"] = target_2

        return self.settings_param

    def add_parameter(self, name, start, end, step):
        self.s.add_parameter(name, start, end, step)

    def generate_setting_ga(self):
        settings = self.s.generate_setting()     
        for d in settings:            
            param = [tuple(i) for i in d.items()]
            self.settings_ga.append(param)
        return self.settings_ga

    def generate_parameter(self):
        """"""
        return random.choice(self.settings_ga)

    def mutArrayGroup(self, individual, indpb):
        size = len(individual)
        paralist = self.generate_parameter()
        for i in range(size):
            if random.random() < indpb:
                individual[i] = paralist[i]
        return individual,

    def object_func(self, strategy_avg):
        """""" 
        return self._object_func(tuple(strategy_avg))

    def optimize(self):
        """"""
        start = time()            
        toolbox = base.Toolbox()  
        pool = multiprocessing.Pool(multiprocessing.cpu_count())
        toolbox.register("map", pool.map)
        # 初始化
        toolbox.register("individual", tools.initIterate, creator.Individual, self.generate_parameter)  
        toolbox.register("population", tools.initRepeat, list, toolbox.individual)  
        toolbox.register("mate", tools.cxTwoPoint) 
        toolbox.register("mutate", self.mutArrayGroup, indpb=1) 
        toolbox.register("evaluate", self.object_func) 
        toolbox.register("select", tools.selNSGA2) 

        MU = 16 
        LAMBDA = 20  
        POP = 20
        pop = toolbox.population(POP)  
        CXPB, MUTPB, NGEN = 0.95, 0.05, 4 
        hof = tools.ParetoFront() 

        stats = tools.Statistics(lambda ind: ind.fitness.values)
        np.set_printoptions(suppress=True) 
        stats.register("mean", np.mean, axis=0) 
        stats.register("std", np.std, axis=0) 
        stats.register("min", np.min, axis=0) 
        stats.register("max", np.max, axis=0) 

        print("开始运行遗传算法,每代族群总数:%s, 优良品种筛选个数:%s,迭代次数:%s,交叉概率:%s,突变概率:%s" % (POP, MU, NGEN, CXPB, MUTPB))
        algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats, halloffame=hof, verbose=True) 
        end = time()
        cost = int((end - start))

        print("遗传算法优化完成,耗时%s秒" % (cost))
        print("----------输出帕累托前沿解集,解集数量%s----------" % (len(hof)))
        # return hof
        for i in range(len(hof)):
            solution = hof[i]
            print(solution)

    @lru_cache(maxsize=1000000)
    def _object_func(self, strategy_avg):    
        engine = self.back
        engine.set_parameters(
            vt_symbol=self.settings_param["vt_symbol"],
            interval=self.settings_param["interval"],
            start=self.settings_param["start"],
            end=self.settings_param["end"],
            rate=self.settings_param["rate"],
            slippage=self.settings_param["slippage"],
            size=self.settings_param["size"],
            pricetick=self.settings_param["pricetick"],
            capital=self.settings_param["capital"],            
        )
        setting = dict(strategy_avg)
        engine.add_strategy(self.settings_param["strategy"], setting)
        engine.load_data()
        engine.run_backtesting()
        engine.calculate_result()
        result = engine.calculate_statistics(output=False)
        target_1 = round(result[self.settings_param["target_1"]], 2)  
        target_2 = round(result[self.settings_param["target_2"]], 2)                   
        return target_1, target_2  


if __name__ == "__main__":

    GE = GeneticOptimizeStrategy()
    GE.backtesting_setting(              
        vt_symbol="IF88.CFFEX",
        interval="1m",
        start=datetime.datetime(2018, 9, 1),
        end=datetime.datetime(2019, 1, 1),
        rate=0.3 / 10000,
        slippage=0.2,
        size=300,
        pricetick=0.2,
        capital=1_000_000,
        strategy=BollChannelStrategy,
        target_1='return_drawdown_ratio',
        target_2="sharpe_ratio",
    )
    GE.add_parameter('cci_window', 4, 50, 2)
    GE.add_parameter('atr_window', 4, 50, 2)
    GE.generate_setting_ga()
    GE.generate_parameter()

    GE.optimize()
Member
avatar
加入于:
帖子: 3
声望: 0

想问下,现在vnpy 可以看到遍历参数的全结果么? 参数平原之类的

Member
avatar
加入于:
帖子: 187
声望: 55

穷举算法可以;遗传算法会输出最后一代的解或者族群,中间过程没有缓存到dict上,可以自己写个dict来实现

Member
avatar
加入于:
帖子: 1
声望: 0

你好,可不可以帮忙做一个DT策略的遗传算法参数优化研究,毕业论文要用,本人不会写代码,如果愿意帮忙的话,可以加524145135微信

Member
avatar
加入于:
帖子: 1
声望: 0

DEAP这个框架耦合度太高了,看着非常别扭,想自己设计一些新的算子、算法让人无从下手。
这两年国内出了个高性能的进化算法框架,看到这篇文章就顺便安利一下,有中文文档,功能强大,支持GA、ES、DE、MOEA等,执行速度比C++还快。
这个是它的官网网址:http://geatpy.com

Member
avatar
加入于:
帖子: 4
声望: 0

hello world!

Member
avatar
加入于:
帖子: 6
声望: 0

真的非常感谢这个,海龟策略专辑,学习到了一个策略如何从回测到真正能上实盘的全过程,赞

Member
avatar
加入于:
帖子: 7
声望: 0

大神好,能不能请教一下,lambda,mu,cxpb,mutpb的设置会怎么影响结果吗?

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】