How can I fit a psychometric function such that the minimum is 50% (chance level)?
Add 0.5 to the intercept and multiply the sigmoid by 0.5 since it now only spans a y-range half of before: 

y = 0.5 + 0.5 / (1 + np.exp(-k*(x-x0)))

Generally, for any chance level:

chance = 0.5  # between 0 and 1
y = chance + (1-chance) / (1 + np.exp(-k*(x-x0)))