def dcc_scenarios(parameter_ids, experiment_ids, backtest_ids):
    parameters = dataframe2json(db.load_dcc_parameters_by_id(parameter_ids))
    experiments = dataframe2json(db.load_experiments(experiment_ids))
    backtests = dataframe2json(db.load_backtests(backtest_ids))
    scenarios = list()    
    for p, e, b in itertools.product(parameters, experiments, backtests):
        p = copy.deepcopy(p)
        e = copy.deepcopy(e)
        b = copy.deepcopy(b)
        metadata = {'parameters_id': int(p['id']),
                    'experiment_id': int(e['id']),
                    'backtest_id': int(b['id'])}
        p.pop('id', None)
        e.pop('id', None)
        b.pop('id', None)
        e['start_date'] = str(e['start_date'])
        e['end_date'] = str(e['end_date'])
        # Numpy.int64 is not JSON serializable for some reason.
        b['trailing_periods'] = int(b['trailing_periods'])
        b['update_periods'] = int(b['update_periods'])
        scenario = {'metadata': metadata,
                    'portfolio': p,
                    'returns': e,
                    'backtest': b}
        scenarios.append(json.dumps(scenario))
    return scenarios

if __name__ == '__main__':
    #%%
    backtest_results = pd.read_sql(query, db.conn)
    
    scenarios = backtest_results.groupby(
        ['experiment_id', 'backtest_id', 'parameters_id'])
    outputs = list()
    for bt in scenarios:
        print(bt[0])
        experiment_id, backtest_id, parameters_id = bt[0]
        results = bt[1]
        
        experiment = db.load_experiment(experiment_id)
        backtest_params = db.load_backtests([backtest_id])
        returns = db.load_returns(experiment)
        excess_returns = returns.values
        train, test = backtest.split_returns(
            excess_returns, 
            backtest_params['update_periods'], 
            backtest_params['trailing_periods'])
        portfolios = pg.decimallistseries2nparray(results.portfolio_weights)
        portfolio_returns = pg.decimallistseries2nparray(results.test_returns)
        train_mean = ps.mean(portfolios[0,:], train[0])
        train_variance = ps.variance(portfolios[0,:], train[0])
        eta = results.eta.iloc[0]
        backtest_statistics = ps.rkw_statistics(
            portfolios, portfolio_returns, eta=eta)
        test_statistics = backtest_statistics['statistics']
        agg_returns = backtest_statistics['aggregate_returns']