看报错内容是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':可能是数据问题,即有些数据是字符串,有些是整数。
在cmd窗口是否有什么报错?
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,那么以开盘价来立刻成交