View difference between Paste ID: vighJ8MZ and DqZ8unaZ
SHOW: | | - or go back to the newest paste.
1
from matplotlib.pyplot import gcf, legend, plot, savefig, show, title, xlabel, ylabel
2
import numpy
3
from numpy import arange, array, average, cumsum, std, zeros_like
4
from numpy.random import random
5
6
BLOCK_REWARD = 25
7
8
def difficulties(diff_increase, epochs, length):
9
    exps = numpy.floor(numpy.linspace(0, epochs, epochs * length, endpoint=False))
10
    return diff_increase ** exps
11
12
def payouts(diffs, hashrate, pool_hashrate):
13-
    pool_rewards = random(len(diffs)) < pool_hashrate / diffs
13+
    pool_rewards = BLOCK_REWARD * (random(len(diffs)) < pool_hashrate / diffs)
14
    return hashrate / pool_hashrate * pool_rewards
15
16
def accumulate(times, hashrate, pool_hashrate, diff_increase, epochs, epoch_length):
17
    diffs = difficulties(diff_increase, epochs, epoch_length)
18
    pays = zeros_like(diffs)
19
    for _ in xrange(times):
20
        pays += payouts(diffs, hashrate, pool_hashrate)
21
    return pays / times
22
23
def plot_cum_payouts(times, hashrate, pool_hashrate, diff_increase, epochs, epoch_length, linetype, label, **plot_kwargs):
24
    pays = accumulate(times, hashrate, pool_hashrate, diff_increase, epochs, epoch_length)
25
    cum_pays = cumsum(pays)
26
    ticks = arange(len(pays))
27
    plot(ticks, cum_pays, linetype, label=label, **plot_kwargs)
28
29
def plot_times_cum_payouts(times, hashrate, pool_hashrate, diff_increase, epochs, epoch_length, linetype, label):
30
    for i in xrange(times):
31
        label_i = label if i == 0 else None
32
        plot_cum_payouts(1, hashrate, pool_hashrate, diff_increase, epochs, epoch_length, linetype, label_i)
33
34
def plot_cloud():
35
    times = 100
36
    inverse_hashrate = 1000
37
    red_pool_percent = 50
38
    blue_pool_percent = 20
39
    difficulty_inc_percent = 15
40
    epochs = 4*2
41
    epoch_length = 2016
42
    plot_times_cum_payouts(times, 1.0/inverse_hashrate, blue_pool_percent/100.0, (1 + difficulty_inc_percent/100.0), epochs, epoch_length, 'b-', "%d%% pool" % blue_pool_percent)
43
    plot_times_cum_payouts(times, 1.0/inverse_hashrate, red_pool_percent/100.0, (1 + difficulty_inc_percent/100.0), epochs, epoch_length, 'r-', "%d%% pool" % red_pool_percent)
44
    legend(loc='upper left')
45
    title("{times} earnings simulations: {difficulty_inc_percent}% difficulty increase every {epoch_length} blocks, {block_reward} btc block reward, miner hash rate = 1/{inverse_hashrate} initial network hash rate".format(
46
        times=times,
47
        difficulty_inc_percent=difficulty_inc_percent,
48
        epoch_length=epoch_length,
49
        block_reward=BLOCK_REWARD,
50
        inverse_hashrate=inverse_hashrate))
51
    xlabel('block')
52
    ylabel('cumulative earnings')
53
    gcf().set_size_inches(16,12)
54
    savefig('simulated_pool_variance.png', dpi=50)
55
    show()
56
57
def plot_average():
58
    times = 10000
59
    inverse_hashrate = 1000
60
    red_pool_percent = 50
61
    blue_pool_percent = 20
62
    difficulty_inc_percent = 15
63
    epochs = 4*2
64
    epoch_length = 2016
65
    plot_cum_payouts(times, 1.0/inverse_hashrate, red_pool_percent/100.0, (1 + difficulty_inc_percent/100.0), epochs, epoch_length, 'r-', "%d%% pool" % red_pool_percent, linewidth=10)
66
    plot_cum_payouts(times, 1.0/inverse_hashrate, blue_pool_percent/100.0, (1 + difficulty_inc_percent/100.0), epochs, epoch_length, 'b--', "%d%% pool" % blue_pool_percent, linewidth=10)
67
    legend(loc='upper left')
68
    title("average earnings from {times} simulations: {difficulty_inc_percent}% difficulty increase every {epoch_length} blocks, {block_reward} btc block reward, miner hash rate = 1/{inverse_hashrate} initial network hash rate".format(
69
        times=times,
70
        difficulty_inc_percent=difficulty_inc_percent,
71
        epoch_length=epoch_length,
72
        block_reward=BLOCK_REWARD,
73
        inverse_hashrate=inverse_hashrate))
74
    xlabel('block')
75
    ylabel('cumulative earnings')
76
    gcf().set_size_inches(16,12)
77
    savefig('simulated_pool_average.png', dpi=50)
78
    show()
79
80
81
def stdev(times, hashrate, pool_hashrate, diff_increase, epochs, epoch_length):
82
    diffs = difficulties(diff_increase, epochs, epoch_length)
83
    earnings = []
84
    for _ in xrange(times):
85
        cum_pays = cumsum(payouts(diffs, hashrate, pool_hashrate))
86
        earnings.append(cum_pays[-1])
87
    return average(earnings), std(earnings), round(100.0 * std(earnings)/average(earnings), 2)
88
89
90
print "pool 0.5 inc 1.15:", stdev(100000, 1/1000.0, 0.5, 1.15, 2*4, 2016)
91
print "pool 0.2 inc 1.15:", stdev(100000, 1/1000.0, 0.2, 1.15, 2*4, 2016)
92
93
plot_cloud()
94
plot_average()