A cumulative distribution function (CDF) gives the probability that a random variable is less than or equal to a chosen value. In financial planning, evaluating the CDF at adjacent wealth-state midpoints converts a continuous return model into transition probabilities. section 6.2.1
From wealth ranges to transition probabilities
For each possible next-period wealth state, calculate its lower and upper midpoint CDF values. Subtracting adjacent values gives the probability of landing in that wealth interval, including zero-wealth and infinite-wealth boundary states. section 6.2.1
Listing 6.2 Computing transition probabilities
from scipy.stats import norm
import warnings
warnings.filterwarnings('ignore')
def compute_mu_sigma(a):
mu = a/(nA-1)*mu_stock + (1-a/(nA-1))*mu_bond
sig = a/(nA-1)*sig_stock
return mu, sig
def compute_midpoints(W):
W_midpts = np.zeros((nW+1,T+1))
W_midpts[0,:] = 0.000001
W_midpts[nW,:] = np.inf
W_midpts[1:nW,:] = (W[:nW-1,:]+W[1:nW,:])/2
return W_midpts
def compute_transition_probs(w, t, a, W_midpts):
mu, sig = compute_mu_sigma(a)
W_tplus1_dist = np.zeros(nW)
cdfs = norm.cdf(np.float64((np.log(W_midpts[:,t+1]/w)
- (mu-0.5*sig**2))/sig)) #1
W_tplus1_dist = cdfs[1:nW+1] - cdfs[0:nW] #2
return W_tplus1_dist
Inspect the Python implementation using SciPy's normal CDF, portfolio mean and volatility, midpoint boundaries, and adjacent-CDF differences. section 6.2.1
The calculation assumes normally distributed stock returns, while allowing replacement with fat-tailed distributions. The resulting transition probabilities feed dynamic programming for goals-based investing. section 6.2.1



