One suggestion is to start with simulated data. There are two aspects to this; the first is simulating data outside of PyMC so that you have a generating model with known properties, and then see if the model can recover the parameters. The second piece is to use sample_prior_predictive with the model above to generate simulated datasets with the model structure and prior choices you have. Both of these should provide clues as to why your model is not working as expected.
As a side note, sampling for 15K iterations and tuning for 20K is very much overkill. 1000 samples is plenty to summarize the posterior (unless you have serious autocorrelation, in which case you need to fix the model) and a couple thousand is usually plenty of tuning (depending on how challenging your model is to sample).