Skip to content

Instantly share code, notes, and snippets.

@rbranson
Created August 17, 2021 18:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rbranson/93731fe97dfd0b0ec70c5e76462b55f5 to your computer and use it in GitHub Desktop.
Save rbranson/93731fe97dfd0b0ec70c5e76462b55f5 to your computer and use it in GitHub Desktop.
import random
import statistics
# last qtr results
price = 229.52
market_cap = 222985351000
# this was fed into https://www.socscistatistics.com/tests/regression/default.aspx
q_rev_hist_mills = [5963, 5817, 5419, 5151, 4865, 4851, 4513, 3997, 3737, 3603, 3392, 3281, 3006, 2865, 2701, 2577, 2397, 2339]
# how many quarters to run the sim
sim_qtrs = 16
def apply_lreg_growth(base, qtrs):
lreg_coeff = 222.79463
lreg_base = 1802
lreg_qtrs_min = 18
return (lreg_coeff*(lreg_qtrs_min+qtrs))+lreg_base
def growth_pstdev(nums, offset):
rates = [nums[n] / nums[n+offset] for n in range(len(nums)-offset)]
return statistics.pstdev(rates)
def price_sim():
base_rev = q_rev_hist_mills[0]
growth_sd = growth_pstdev(q_rev_hist_mills, 4)
outstanding = market_cap/price
rev_mult = market_cap/(base_rev*4)
rev_last_qtr = base_rev
prices = []
for q in range(sim_qtrs):
rev_this_qtr = apply_lreg_growth(base_rev, q+1)
growth_this_qtr = rev_this_qtr / rev_last_qtr
rev_this_qtr = rev_last_qtr * random.gauss(growth_this_qtr, growth_sd)
new_mkt_cap = (rev_this_qtr * 4) * rev_mult
new_price = new_mkt_cap / outstanding
prices.append(new_price)
rev_last_qtr = rev_this_qtr
return prices
def nsim(nsamples=10000):
qtrs = [[] for _ in range(sim_qtrs)]
for _ in range(nsamples):
prices = price_sim()
for i, p in enumerate(prices):
qtrs[i].append(p)
return qtrs
simout = nsim()
for qsim in simout:
qmin = min(qsim)
qmax = max(qsim)
qmean = statistics.mean(qsim)
print(qmin, qmax, qmean)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment