Пример #1
0
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)