Stats and Bonuses

Jim's blog on data and everything else | 🔮💰👑🤔💻📷🍁🌌🔬🏹

Income curves for different STEM career paths


First post. I will explore using some salary data and crude models, several ideal different career paths that a Caltech undergraduate might take after four years of torture:

  1. Software development job at a large software company (like Gargle or equivalent)
  2. Software development job at a large software company and then a startup (Snoop) at age 30
  3. Investment banking (Goldwoman)
  4. Consulting (Pasadena Consulting Group)
  5. Quant hedge fund (Three Sigma)
  6. PhD and then go to a quant hedge fund (3$\sigma$): fake academic
  7. PhD and attempt to become a professor (all at Caltech): true academic

Goals

  • Include somewhat realistic personal investment effects
  • Include family costs (food, housing)
  • Include vacation costs
  • Habit differentiation according to profession
  • Include spending money on misc. things

Things I'm missing

  • Money value of time: CS jobs will probably work fewer hours than Goldwoman monkeys, idk how to put a dollar value on that
  • Sudden unfortunate events (health issues, bad investments, etc) - simulations can be made, but not worth my time
  • Frequent job changes over career. We will not look at constant career switches.
  • Accurate career ladder timelines for many of the jobs (SWE, quant) would make better curves
  • Unusually large purchases (mansion, yacht?), since we don't really know when these will happen. I hope large house purchases are captured by the monthly rent and annual 10% spendings.

Some assumptions

  • Everyone is quite competent (good enough to get a job at these top-end companies and do well in them)
  • Everybody works until retirement (assume at 65)
  • The non-true academics will have similar eating habits and expenses for most of their life
  • The true academic (option 7) and the fake academic (option 6) will eat free food from campus events and Panda Express during grad school, because they are grad students. This habit will continue into later life for the true academic (option 7) because being a post-doc isn't much better.
  • Housing will be \$2500/month for the non-academics until age 30, and then become \$3500/month because they will require more space for more people.
  • For the academics, academic housing will be \$1200 per month, and also go to \$3500/month after age 30, since all humans are created equal in the eyes of expensive rent.

Base Salaries

  1. Gargle SWE: \$120000
  2. Gargle SWE \$120000 and senior SWE at Snoopchat: \$160000
  3. Papa Goldwoman: \$74000 analyst monkey (?!)
  4. PCG: \$150000 consultant
  5. Three Sigma: \$150000 quant
  6. Caltech grad student \$32000 and Three Sigma quant researcher: \$175000
  7. Caltech grad student \$32000, post-doc \$50000, assistant prof \$137000, associate prof \$150000, real prof \$210000

Now we can plot some crude wealth curves, without salary growth.

  • Cost of housing: as above
  • Cost of food for non-academics: average \$40 per day (forget Gargle's free food), goes up to \$60 per day after age 30 due to self+kids
  • Cost of food for academics: \$20 per day, goes up to \$35 per day after age 35 if a true academic.
  • Cost of happiness (vacation, non-essential goods) for non-true academics: \$15000 per year, and the fake academic is the same during grad school
  • Cost of vacation is \$20000 a year for true academics after becoming a real prof at age 50. Real profs love vacation.

It will certainly be interesting to look upon this post several years into the future and see how my understanding of the world has changed.

In [1]:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
In [2]:
ages = np.arange(22, 65+1)
wages = np.repeat([[120000,120000,74000,150000,150000,32000,32000]], len(ages), axis=0).T

# wage changes:
wages[1][(30-22):len(ages)] = 160000 # Snoopchat
wages[-2][(28-22):len(ages)] = 175000 # Three Sigma quant researcher after phd

# the true academic:
wages[-1][(28-22):(35-22)] = 50000
wages[-1][(35-22):(40-22)] = 137000
wages[-1][(40-22):(50-22)] = 150000
wages[-1][(50-22):len(ages)] = 210000

# housing costs
housing = 12*np.repeat([[2500,2500,2500,2500,2500,1200,1200]], len(ages), axis=0).T # annualize
# after age 30:
housing.T[(30-22):len(ages)] = 12*np.repeat([[3500,3500,3500,3500,3500,3500,3500]], 
                                            len(ages)-(30-22), axis=0)
# food costs
food = 365*np.repeat([[40,40,40,40,40,20,20]], len(ages), axis=0).T
food[0:-1].T[(30-22):len(ages)] = 365*np.repeat([[60,60,60,60,60,60]], 
                                            len(ages)-(30-22), axis=0)
food[-1][(35-22):len(ages)] = 365*35 # true academic food
happiness = 15000 # vacations and stuff

# total
net_earnings = wages-housing-food
net_earnings[0:-2] -= happiness # only the academics dont have fun, so no vacation cost
# the fake academic starts taking vacations after grad school
net_earnings[-2][(28-22):len(ages)] -= happiness
net_earnings[-1][(50-22):len(ages)] -= 20000
accumulated = np.cumsum(net_earnings, axis=1)
In [3]:
mpl.style.use('dark_background')
data = pd.DataFrame(accumulated.T, index=ages)
data.columns = ['Gargle', 'Gargle->Snoop', 'Goldwoman', 'PCG', 'Three Sigma', 'Fake Academic', 'True Academic']
data.plot()
plt.ylabel('Accumulated Wealth ($)')
plt.xlabel('Age')
fig = plt.gcf()
fig.set_dpi(200)
fig.set_size_inches(5,4, forward=True)
plt.show()
plt.close()

But that is nonsense, since our Goldwoman analyst monkey is in debt by age 65, and still an analyst monkey alongside their 22 year old PowerPoint-generating monkey peers...

So wage growth and promotions need to be accounted for.

  1. Gargle has a crazy RPG style leveling scheme, T3 upon undergrad hiring and up to T10 as Gargle Fellow (like VP). T10 might not be achievable given the size of the company at this time, so let's level cap it at T9 (Senior Director = \$300k). Linear interpolation until age 45 as max level, since we have no clue about the timeline.
  2. I dont think Snoop has old people yet, but supposing they continue expanding into a giant (uncertain, given their business model), we can just take some checkpoints for a large company like Gargle and scale it up for early bird entrance. Same deal as Gargle, just increase the maximum to \$350k at age 45 (as if T10 were reachable).
  3. Goldwoman has their own ladder according to Quora, with a provided timeline, so we can just use that: 2 years analyst monkey, associate (\$110k) until 5 year mark, VP (\$155k) until nobody knows when - let's say this monkey is MD material and no more - so VP until the conservative guess of the 12 year mark, then MD (\$400k) until retirement. By that point the monkey has grown to become a giant chest-pounding gorilla with an ego to go with their size. Salaries from Glassdoor again.
  4. PCG: according to Quora, we have Associate (\$78k) -> Consultant (\$147k) -> Project Leader (\$179k) -> Principal (\$218k) -> Partner (\$329k) as the proper progression, so we need to adjust the PCG salary timeline accordingly. Let's just say it's similar to Goldwoman's timeline.
  5. Quant: same as below
  6. For the quant hedge fund, there doesn't seem to be much data for Three Sigma at higher positions, so we will make do with the Senior Management Associate at Bridgefire (a not-so-quant, but still hedge fund place) salary of around \$329k/year as the end goal at 20 years in (age 42). We linearly interpolate between whenever they got the job and age 42 for a constant pay raise.
  7. The true academic is taken care of in the code above: he climbs the academic ladder at only Caltech, as scheduled. He is stuck here his whole life. Note that this ladder concept usually happens over multiple institutions. He will easily have taken more $\int$integrals than naps by the time he retires. Also, he will be a master of applying for grant money and funding and putting his name last on papers his grad students write.

Ah, but wait.. We forgot:

  • Income Taxes: let's set it to 35% for annual incomes over \$150k, and 30% below that. I'm not quite sure how grad student wages are taxed.
  • Equity (especially for the Snoopper): let's assume stock futures are worthless there, because they truly are, for now
  • Bonuses: let's assume they are indeed included already
  • Personal investments (quants would throw their money into some strategies): 13% annual returns on accumulated wealth for quants. If they can't beat the S&P500 (approx 12.7% annually for the past 5 years), what are they doing? Also, 10% annually for Goldwoman monkey, 5% annually for everyone else.
  • Inflation - let's forget about this one, just use 2018 dollars.
  • Spare cash: cars, houses, yachts, etc. will be 10% of accumulated savings, spent year.
In [4]:
wages = np.zeros((7, len(ages)))
# Gargler
wages[0] = np.interp(ages, [22,45], [120000,300000])
# Snoopper from Gargle: takes Gargle curve until age 30
wages[1][0:(30-22)] = np.interp(ages[0:(30-22)], [22,45], [120000,300000])
wages[1][(30-22):len(ages)] = np.interp(ages[(30-22):len(ages)], [30,45], [160000,350000])
# Goldwoman gets MD just 12 years in!
wages[2] = np.interp(ages-22, [0,2,5,12], [74000,110000,155000,400000])
# bcg:partners are around age 40 ish according to my contacts
wages[3] = np.interp(ages-22, [0,2,5,15,20], [78000,147000,179000,218000,329000])
# quant guy at 2sigma:
wages[4] = np.interp(ages, [22,42], [150000,329000])
# fake academic
wages[5][0:6] = 32000 # no pay raise as a grad student
wages[5][6:] = np.interp(ages[6:], [28,42], [175000,329000]) # goes to 2sigma
# the true academic: academics dont get pay raises, so no interpolation needed
wages[-1][0:6] = 32000
wages[-1][(28-22):(35-22)] = 50000
wages[-1][(35-22):(40-22)] = 137000
wages[-1][(40-22):(50-22)] = 150000
wages[-1][(50-22):len(ages)] = 210000

# tax those wages using a boolean mask
bool_hitax = wages>150000
wages = wages*bool_hitax*0.65 + wages*np.invert(bool_hitax)*0.7

# total
net_earnings = wages-housing-food
net_earnings[0:-2] -= happiness # only the academics dont have fun, so no vacation cost
# the fake academic starts taking vacations after grad school
net_earnings[-2][(28-22):len(ages)] -= happiness
net_earnings[-1][(50-22):len(ages)] -= 20000

# to take into account investment, I cannot resist a for loop..
accumulated = np.zeros(wages.shape)
accumulated.T[0] = net_earnings.T[0]
# yes, the fake academic has a strategy in grad school too :)
investment_gains = np.array([5,5,10,5,13,13,5])/100 # percentages
for i in range(1, len(ages)):
    # can't invest negative money
    accumulated.T[i] = accumulated.T[i-1] + net_earnings.T[i] +\
        (accumulated.T[i-1]>0)*accumulated.T[i-1]*investment_gains -\
        (accumulated.T[i-1]>0)*accumulated.T[i-1]*0.10
In [5]:
data = pd.DataFrame(accumulated.T, index=ages)
data.columns = ['Gargle', 'Gargle->Snoop', 'Goldwoman', 'PCG', 'Three Sigma', 'Fake Academic', 'True Academic']

data.plot()
plt.ylabel('Accumulated Wealth ($)')
plt.xlabel('Age')
fig = plt.gcf()
fig.set_dpi(200)
fig.set_size_inches(5,4, forward=True)
plt.show()
plt.close()

# need log y-scale
data.plot()
plt.ylabel('Accumulated Wealth ($)')
plt.xlabel('Age')
plt.yscale('log')
fig = plt.gcf()
fig.set_dpi(200)
fig.set_size_inches(5,4, forward=True)
plt.show()
plt.close()

It looks like those 13% annual returns become quite scary when compounded over 40 years. This is not too realistic, but am I really qualified enough to guess what the actual percentage is?

Let's try without investment effects:

In [6]:
# we will pretend the yearly spendings are like negative investments
accumulated = np.zeros(wages.shape)
accumulated.T[0] = net_earnings.T[0]
for i in range(1, len(ages)):
    # can't spend negative money
    accumulated.T[i] = accumulated.T[i-1] + net_earnings.T[i] -\
        (accumulated.T[i-1]>0)*accumulated.T[i-1]*0.10
In [7]:
data = pd.DataFrame(accumulated.T, index=ages)
data.columns = ['Gargle', 'Gargle->Snoop', 'Goldwoman', 'PCG', 'Three Sigma', 'Fake Academic', 'True Academic']

data.plot()
plt.ylabel('Accumulated Wealth ($)')
plt.xlabel('Age')
fig = plt.gcf()
fig.set_dpi(200)
fig.set_size_inches(5,4, forward=True)
plt.show()
plt.close()

Summary

  • Without personal investments, Papa Goldwoman has the most money, but probably worked 2x as many hours as everyone else
  • The accumulated wealth curves level out since 10% wealth annual spending becomes larger than the wage
  • The true academic seems to go bankrupt when starting a family, so something might be a little off about this model...
  • People survive in the real world because their family (parents, spouse) gets them money
  • Tech is a decent field to work in if one doesn't have a preference for type of work
  • Good investments, not salaries, make people very rich