I'm running a monte carlo simulation of a financial instrument, and I'm trying to understand why the final balance of each simulation gives me a skewed distribution rather than a normal distribution (given that I'm sampling out of a normal distribution using np.random.normal).
I assume average monthly return of 1%, standard deviation of 4 and projecting for 60 months. My method is to sample from a normal distribution using np.random.normal and create an array out of that. Then I take a starting balance and multiply that over each element and create a list. I append 500 of these simulations to a dataframe:
df = pd.DataFrame()
for i in range(1, 501): #500 simulations
pct = np.random.normal(loc = 1, scale = 4, size = 60) #mean 1%, std 4%, 60 month period
df['Simulation_' + str(i)] = balance_updater(100000, pct)
where the function balance_updater creates a list that documents every iteration (in this case, starting balance = 100000), coded as the following:
def balance_updater(starting_balance, pct):
balance = starting_balance
balance_list = []
for i in range(len(pct)):
balance = (balance + balance * pct[i] / 100).round(2)
balance_list.append(balance)
return balance_list
Then when I plot via:
sns.distplot(df.iloc[-1, bins=30) #Plot final balances only
I expected this to be normally distributed but we can see it slightly skewed to the right.
What puzzles me more is that if I were to project for a longer period of time (let's say 30 years = 180 months) the results become even more skewed:
I'm trying to understand why a longer projected period produces a more skewed graph, which violates my understanding of the central limit theorem with more sampling (360 vs 60).
Thank you.