VeighNa量化社区
你的开源社区量化交易平台
KeKe's Avatar
Member
离线
187 帖子
声望: 51

看报错内容是vnconda内的vnpy文件不完整或者被破话;建议手动重装vnpy

或者舍去vnconda,在github下载vnpy装在anaconda上(社区文档有相关资料)

图片看不到。。。

基于@张国平 平总的遗传算法做了一些改动,虽然实现了多进程,但是无法使用到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()

请更新到最新的版本

打开ctabacktester后,应该会看到初始化完成的日志“CTA回测引擎初始化完成 / RQData数据接口初始化成功”。需要初始化RQData,先配置账号密码信息,如我的在“C:\Users\Administrator.vntrader”内的vt_setting.json中。
具体的请看vnpy文档:CTA回测模块

进行运行的是ananconda里面的vnpy。
如同在anaconda里面调用numpy一样。

tests\backtesting文件夹内有数据调用回测示例

not supported between instances of 'str' and 'int':可能是数据问题,即有些数据是字符串,有些是整数。

vt_symbol要求填合约品种+交易所,所以报错是“not enough values to unpack (expected 2, got 1)”。
正确的如IC1905.CFFEX

IB,Tiger,Futu

能否展示一下你parameter_generate()函数,以及遗传算法中MU, LAMBDA, CXPB, MUTPB, NGEN等参数

请提供报错截图。
(我试过可以的)

随便点击一个,如“.vntrader”,然后点击右下方的“选择文件夹”。
看看能否正常打开jupyter notebook

注意遗传算法有迭代书NGEN=40。这意味着要跑40个轮回。
其应用场景是多维度的参数优化,因为暴力穷举的数量上指数上升的;而遗传算法在每次迭代过程中都筛选的良好的参数,这样会大大降低测试的数量

没账号信息说明没连上ib接口。
能否提供一下报错信息?

合约格式写错了,应该上rb1905.SHFE。
试试这个

python版本或者pandas版本出现问题吧

vnpy1.9.2用的是anaconda5.2 (32位),python 2.7
2.0版本用的是最新anaconda (64位),python3.7。

建议直接使用VNConda,应该可以直接安装rqdata

用的是本地停止单,就比如当前价格是100点,海龟策略发出信号,在下一根K线的120线发出买入:

若价格没突破到120点,继续挂着。
若价格从100涨到130,那么在120点的时候停止单变成市价单追上去保证尽可能成交。
若下一根K线的开盘价大于120,那么以开盘价来立刻成交

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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