请教大神,randrange()只能整数,参数是非整数的怎么办?
请教大神,randrange()只能整数,参数是非整数的怎么办?
玩游戏 wrote:
请教大神,randrange()只能整数,参数是非整数的怎么办?
我是用random.uniform(begin, end), 返回begin,end直接随机非整数。
或者你可以直接randrange()/10.0 也可以。。。
谢谢,随机非整数会不会耗时太长或者结果比较意外?
另外请教不改任何的情况下每次执行出来的输出优化参数结果不一样,这个是什么原因呢?
还有,我把输出优化参数结果拿回去跑回测,回测结果也和优化结果不一样。
完全晕掉了
玩游戏 wrote:
另外请教不改任何的情况下每次执行出来的输出优化参数结果不一样,这个是什么原因呢?
还有,我把输出优化参数结果拿回去跑回测,回测结果也和优化结果不一样。
完全晕掉了
每次不一样是可以理解,族群要更多,还有进化次数也要更多,最好会一个差不多的接近的参数范围。
回测结果应该一样的,不过我用的是按次统计的,用按天统计我总是出现极端值。
基于@张国平 平总的遗传算法做了一些改动,虽然实现了多进程,但是无法使用到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()
想问下,现在vnpy 可以看到遍历参数的全结果么? 参数平原之类的
穷举算法可以;遗传算法会输出最后一代的解或者族群,中间过程没有缓存到dict上,可以自己写个dict来实现
你好,可不可以帮忙做一个DT策略的遗传算法参数优化研究,毕业论文要用,本人不会写代码,如果愿意帮忙的话,可以加524145135微信
DEAP这个框架耦合度太高了,看着非常别扭,想自己设计一些新的算子、算法让人无从下手。
这两年国内出了个高性能的进化算法框架,看到这篇文章就顺便安利一下,有中文文档,功能强大,支持GA、ES、DE、MOEA等,执行速度比C++还快。
这个是它的官网网址:http://geatpy.com
hello world!
真的非常感谢这个,海龟策略专辑,学习到了一个策略如何从回测到真正能上实盘的全过程,赞
大神好,能不能请教一下,lambda,mu,cxpb,mutpb的设置会怎么影响结果吗?