Post
Topic
Board Economics
Re: (SSS) - A Sane and Simple bitcoin Savings plan
by
tonico
on 25/11/2013, 12:51:24 UTC
This is a just for fun implementation in Pyhton, probably a bit over-engineered  Grin

You can change the parameters in main() or write an argument parser.

$ python -m sssplan
 Price  mB left  mB sold  k$ out  mB val.  k$ sum  total val.
    2   9000     1000       2       18       2       20
    4   8100      900       4       32       6       38
    8   7290      810       6       58      12       70
   16   6561      729      12      105      24      129
   32   5905      656      21      189      45      234
   64   5314      590      38      340      83      423
  128   4783      531      68      612     151      763
  256   4305      478     122     1102     273     1375
  512   3874      430     220     1984     493     2477
 1024   3487      387     397     3570     890     4461


Code:
def iter_price(initial_price, steps, base=2):
    for i in steps:
        yield initial_price * base ** i

def iter_mbtc_left(initial_btc, rake, steps):
    base = (1 - rake)
    for i in steps:
        yield initial_btc * base ** i

def iter_mbtc_sold(initial_btc, rake, steps):
    piece = initial_btc * rake
    base = (1 - rake)
    for i in steps:
        yield piece * base ** (i - 1)

def iter_kusd_out(mbtc_sold, price):
    for mbtc, usd in zip(mbtc_sold, price):
        yield mbtc * usd / 1000.

def iter_kusd_sum(kusd_out):
    s = 0
    for kusd in kusd_out:
        s += kusd
        yield s

def iter_mbtc_val(mbtc_left, prices):
    for mbtc, price in zip(mbtc_left, prices):
        yield mbtc * price / 1000.

def iter_total_val(mbtc_val, kusd_sum):
    for item in zip(mbtc_val, kusd_sum):
        yield sum(item)

def main():
    base = 2 # doubling
    numof_steps = 10
    initial_price = 1 # kUSD
    inital_btc_stash = 10000 # mBTC
    rake = 0.1

    steps = range(1, numof_steps + 1)
    prices = list(iter_price(initial_price, steps, base=base))
    mbtc_left = list(iter_mbtc_left(inital_btc_stash, rake, steps))
    mbtc_sold = list(iter_mbtc_sold(inital_btc_stash, rake, steps))
    kusd_out = list(iter_kusd_out(mbtc_sold, prices))
    mbtc_val = list(iter_mbtc_val(mbtc_left, prices))
    kusd_sum = list(iter_kusd_sum(kusd_out))
    total_val = list(iter_total_val(mbtc_val, kusd_sum))

    print ' Price  mB left  mB sold  k$ out  mB val.  k$ sum  total val.'
    fstr = ' {0:4} {1:6.0f} {2:8.0f} {3:7.0f} {4:8.0f} {5:7.0f} {6:8.0f}'
    for args in zip(prices, mbtc_left, mbtc_sold,
                    kusd_out, mbtc_val, kusd_sum, total_val):
        print fstr.format(*args)

if __name__ == '__main__':
    main()