Skip to content

Instantly share code, notes, and snippets.

@badjano
Last active February 20, 2020 18:18
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 badjano/3d2ef1025b62878bce023622842aa0d8 to your computer and use it in GitHub Desktop.
Save badjano/3d2ef1025b62878bce023622842aa0d8 to your computer and use it in GitHub Desktop.
Stock to flow model
#please donate BTC: 1BADjanox8xaNUYTQgHcXw6mmwuSsE9ZSg
import datetime
import locale
import matplotlib.pyplot as plt
locale.setlocale(locale.LC_ALL, 'en_CA.UTF-8')
reward = 50
total_btc = 0
halving = 0
days_per_year = 365
years_per_halving = 4
blocks_per_halving = 210000
years_per_block = datetime.timedelta(days=days_per_year * years_per_halving / blocks_per_halving)
blocks_per_day = int(blocks_per_halving / (days_per_year * years_per_halving))
sat = 1 / 100000000
history = []
start_time = datetime.datetime.strptime("03/01/2009", "%d/%m/%Y")
end_time = datetime.datetime.strptime("03/01/2030", "%d/%m/%Y")
time = []
halving_time = []
ordinal = lambda n: "%d%s" % (n, "tsnrhtdd"[(n / 10 % 10 != 1) * (n % 10 < 4) * n % 10::4])
def stock_to_flow(stocks):
for i in range(blocks_per_day, len(stocks)):
stock = stocks[i - blocks_per_day]
stock2 = stocks[i]
flow = (stock2 - stock) * 10000
yield pow(stock2 / flow, 3.5) * 10000
print("Start, reward = %.08f" % reward)
while start_time < end_time and reward > 0:
for i in range(blocks_per_halving):
total_btc += reward
history.append(total_btc)
start_time = start_time + years_per_block
time.append(start_time)
halving_time.append(start_time)
reward = int((reward / 2) / sat) * sat
halving += 1
if reward > 0:
print("%s Halving, reward = %.08f, time (aprox): %s" % (ordinal(halving), reward, start_time.strftime("%d/%m/%Y")))
prices = list(stock_to_flow(history))
plt.yscale("log")
plt.plot(time[blocks_per_day:], prices)
for o in range(len(halving_time) - 1):
ht = halving_time[o]
u = time[blocks_per_day:].index(ht)
price1 = prices[u + blocks_per_day]
price2 = prices[u + blocks_per_halving]
p1 = locale.currency(price1, grouping=True)
p2 = locale.currency(price2, grouping=True)
hts = ht.strftime("%d/%m/%y")
plt.annotate("%s Halving\n%s\nmin: %s\nmax: %s" % (ordinal(o + 1), hts, p1, p2), xy=(ht, price2))
plt.show()
#please donate BTC: 1BADjanox8xaNUYTQgHcXw6mmwuSsE9ZSg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment