Multiple y values for each x in GP

I’m trying to model financial market data with a GP. I’ve got a model working fine and I’m currently calibrating it using close prices but would like to have Open, High, Low and Close to give it an idea of daily range. I’ve tried to supply the data in long format with an indexer that maps each of those prices to the right trading day. From a data presentation point of view this is handled by dimensions and letting pymc know that each x value has 4 y values. However the result is pretty horrific. The model calibrates nicely with close prices and gives somewhat believable results but if we use those 4 prices it doesn’t even calibrate. The trace plot is really bad, r_hat values are in the 1.50 area and the fit is terrible even in sample. I’m clearly doing something wrong but not sure what is wrong at this stage


px = yf.download(tickers, period=f'{period}MO', interval='1D').ffill()

# Save scaling variables
mean, std = (px.mean(), px.std())

# Center and scale data
data = px.apply(lambda x: (x - x.mean()) / x.std())

# Reset the index and rename the columns
data = data.reset_index(col_level=1)

# Melt the data to long format
data = pd.melt(data,
        id_vars = [('', 'Date')],
        value_vars=[(type, t) for t in tickers for type in ['Open', 'High', 'Low', 'Adj Close']], 
        var_name=['Price', 'Contract'],
        value_name='Scaled'
       )

# Add a new column x
data['x'] = data.groupby('Contract').cumcount()

# Add output_index column
data["output_idx"] = data.Contract.map({contract:i for i, contract in enumerate(tickers)})

# Check data has the correct shape
data

What’s your model look like? They way you’re describing is one way to do a multiple output GP, but there may be more efficient ways to do it depending on the correlations you want to model between your outputs.