def create_scenarios(output_file, parameters_query, parameters_names, type_id):
    query = '''
    WITH 
    
    parameters AS (
    {parameters_query}
    ),
    
    exp_sub AS (
    SELECT *
    FROM experiments
    WHERE id >= 23
    ),
    
    bt_sub AS (
    SELECT *
    FROM backtests
    WHERE id = 2
    )
    
    SELECT 
      parameters.*,
      exp_sub.id as experiment_id,
      exp_sub.returns_name,
      exp_sub.asset_columns,
      exp_sub.start_date,
      exp_sub.end_date,
      exp_sub.granularity,
      bt_sub.id as backtest_id,
      bt_sub.trailing_periods,
      bt_sub.update_periods
    FROM
      parameters CROSS JOIN
      exp_sub CROSS JOIN
      bt_sub
    '''.format(parameters_query=parameters_query)
    
    scenarios = pd.read_sql(query, db.conn)
    
    scenarios['type_id'] = type_id
    
    metadata = pg.dataframe2dictlist(scenarios[['parameters_id', 'experiment_id', 'backtest_id', 'type_id']])
    parameters = pg.dataframe2dictlist(scenarios[parameters_names])
    returns = pg.dataframe2dictlist(scenarios[['returns_name', 'asset_columns', 
                                               'start_date', 'end_date', 'granularity']])
    backtest = pg.dataframe2dictlist(scenarios[['trailing_periods', 'update_periods']])
    
    scenarios_list = list()
    for m, p, r, b in zip(metadata, parameters, returns, backtest):
        scenarios_list.append(json.dumps(
            {'portfolio': p,
             'metadata': m,
             'returns': r,
             'backtest': b}, default=pg.json_default))
    
    with open(output_file, 'w') as outfile:
        outfile.write('\n'.join(scenarios_list))
  e.end_date,
  e.granularity,
  bt_sub.id as backtest_id,
  bt_sub.trailing_periods,
  bt_sub.update_periods
from portfolio_parameters pp 
cross join experiments e 
cross join backtests bt
where pp.type_id = 3
  and e.id >=3
'''
ewp = pd.read_sql(query, db.conn)

# %%
metadata_columns = ['parameters_id', 'type_id', 'experiment_id', 'backtest_id']
metadata_list = pg.dataframe2dictlist(ewp[metadata_columns])

portfolio_list = ewp.parameters.tolist()

returns_columns = ['end_date', 'start_date', 'granularity', 'returns_name', 
                   'asset_columns']
returns_list = pg.dataframe2dictlist(ewp[returns_columns])

backtest_columns = ['trailing_periods', 'update_periods']
backtest_list = pg.dataframe2dictlist(ewp[backtest_columns])

# %%
scenarios_list = zip(metadata_list, portfolio_list, returns_list, backtest_list)
scenarios_fields = ['metadata', 'portfolio', 'returns', 'backtest']
scenarios = [json.dumps({k: v for k, v in zip(scenarios_fields, s)},
                        default=pg.json_default)