def test_main(symbols, start_date, end_date, opt_month, val_month, test_month): fig_title = fig_title_generate(symbols) # 用于生成图表的标题 order_list = [] # 存放回测结果 parameters = pd.DataFrame() # 数据读取 file_dir = "Data//TestData//" result_dir = "Data//Backresult//" file_paths = [file_dir + forex + '1.csv' for forex in symbols] data = read_mt4_data(file_paths, start=start_date, end=end_date) total_month = num_month_get(start_date, end_date) # 总回测月数 iteration = num_iteration_get(total_month, opt_month, val_month, test_month) evaluation_factor = 0 for i in range(iteration): _start = date_handle(start_date, i * opt_month) _end = date_handle(_start, opt_month) opt_period = test_period_generate(_start, _end) my_data = Data() my_data.data = [dt.ix[_start:_end] for dt in data] # pop 存放优化后的策略参数 pop = optimize(data=my_data) pop = np.array(pop) # 把pop类型由individual转化为array类型,方便处理 a = np.array(pd.DataFrame(pop).drop_duplicates()) # 去除pop里边重复的参数 # 参数验证 num_avg = len(a) # 参数个数 val = Validation.StrategyValidation(symbols) # 生成参数验证实例 if val_month == 0: pass else: _start = _end # 验证开始时间 _end = date_handle(_start, val_month) # 验证结束时间 val.data = [dt.ix[_start:_end] for dt in data] # 验证数据 val_dict = {} # 保存策略参数,类型为字典 # 参数遍历,返回优化后的参数 for j in xrange(num_avg): _avg = a[j] immediate = val.capital(_avg) val_dict[immediate] = _avg immediate_keys = val_dict.keys() immediate_keys.sort() avg = val_dict[immediate_keys[-1]] # 保存最优参数 opt_path = result_dir + 'opt_result' + "//" + opt_period + "//" if os.path.exists(opt_path): pass else: os.makedirs(opt_path) opt_result_save(symbols, avg, my_data.data, opt_path) parameter = paramater_save(symbols, opt_period, avg, opt_month) parameters = parameters.append(copy.deepcopy(parameter)) _start = _end # 实测开始时间 _end = date_handle(_start, test_month) # 实测结束时间 if end_date_compare(end_date, _end): _end = end_date test_data = [dt.ix[_start:_end] for dt in data] val.data = test_data alt_parameter, alt_factor = val.parameter_exchange() if (evaluation_factor < 0 and alt_factor > 0): avg = alt_parameter bt = TradeTest(parameter_match(symbols, avg)) bt.init_data = test_data temp = bt.on_test() evaluation_factor = strategy_evaluate(temp) test_period = test_period_generate(_start, _end) test_path = result_dir + 'test_result' + "//" + test_period + "//" if os.path.exists(test_path): pass else: os.makedirs(test_path) backresult = cal_backtest_result(temp, fig_title, plot_date=False, dir_path=test_path) account_plot(bt.account, bt.init_data, test_path, plot_show=False) save_backresult(backresult, test_path) if temp: order_list.extend(temp) parameters.to_csv("Data//Backresult//parameters.csv") # 计算回测结果 backresult = cal_backtest_result(order_list, fig_title, plot_date=False) save_backresult(backresult)