Last active
February 20, 2020 18:18
-
-
Save badjano/3d2ef1025b62878bce023622842aa0d8 to your computer and use it in GitHub Desktop.
Stock to flow model
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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