Thanks for the reply!!
Dirichlet is of course a default option. However, It does not work in my model.Here I would like to briefly introduce my model. It is a hidden markov chain whose latent states are simplexes, and obervable data is a chain of real numbers. To model the data, I imposed a dirichlet transition distribution and a normal emission distribution. like: P(wt|wt-1)~Dirichlet(wt-1); P(Xt|wt)~N(wt*zt), wt , the latent state at time t, should be on a d dimension simplex. zt is a d dimension verctor and Xt is a number. zt and Xt are observable. However, with this paraterimization, the dirichlet transition tends to ‘pull’ wt to uniform distribution when t is large, and fail to fit the data. It is perhapes because Dirichlet distribution is most stable at a uniform distribution, like[1/3, 1/3, 1/3]. Since the variance of Dirichlet(alpha_1,alpha_2,…alpha_d) is large on the dimensions whose alpha_k is large, and small whose alpha_k is small. So I want to turn to truncated normal constrained on a simplex.
your advise of adding stickbreaking transformation sounds great. I am a new to pymc, Can you give some detailed suggestion? Like how to write code to define a truncated normal distribution constrained on a simplex, with given mean vector MU and dignal covariance matrix I . My previous code which define the structure of my model is pasted here for your reference. so grateful for your help!!!
with pm.Model() as BGM:
Fund_Return_ser = 
w_ser = [industry_df.loc[date_list].values]
for i, date in enumerate(date_list):
#local_alphas = w_ser[i-1]* (alpha_zero- len(w_ser))+ 1
w_ser.append (pm.Dirichlet('w_'+ str(date)[:10], (w_ser[i-1]* (alpha_zero- len(w_ser))+ 1), shape = len(w_ser)))
#R_mu = pm.math.dot(w_ser[i], ind_return.loc[date].values)
Fund_Return_ser.append( pm.Normal('Fund_Return'+ str(date)[:10], mu = pm.math.dot(w_ser[i], ind_return.loc[date].values),\
sigma = (sigma_sqr**0.5)/10, observed = factitious_return.loc[date]))