Created
July 7, 2016 12:29
-
-
Save ChristianGaertner/f72e8c8636b4a8cd0e43e69c3dfd1f43 to your computer and use it in GitHub Desktop.
This file contains 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
%matplotlib inline | |
import matplotlib.pyplot as plt | |
import numpy as np | |
import random | |
def median(series): | |
return sum(series)/len(series) | |
class Beverage: | |
def __init__(self, name, median_cost, upper, lower, start, step=50): | |
self.name = name | |
self.series = [] | |
self.sold_at = [] | |
self.median_cost = median_cost | |
self.upper = upper | |
self.lower = lower | |
self.step = step | |
self.set_new(start) | |
@property | |
def sum_sold(self): | |
sold = 0 | |
for volume, index in self.sold_at: | |
sold += volume * self.series[index] | |
return sold | |
@property | |
def sell_volume(self): | |
total = 0 | |
for volume, _ in self.sold_at: | |
total += volume | |
return total | |
@property | |
def profit(self): | |
total = 0 | |
for volume, index in self.sold_at: | |
total += volume * (self.series[index] - self.median_cost) | |
return total | |
@property | |
def current(self): | |
return self.series[-1] | |
def tick(self): | |
current = self.current | |
chance = 0.5 | |
if self.profit < 1000: | |
chance -= 0.1 | |
if median(self.series) < self.median_cost: | |
chance -= 0.05 | |
elif median(self.series) > self.median_cost * 2: | |
chance += 0.05 | |
if self.upper * 0.9 < current: | |
chance += 0.1 | |
if self.lower * 1.2 > current: | |
chance -= 0.1 | |
up = random.uniform(0, 1) > chance | |
change = random.randint(0, self.step) | |
new = current + change if up else current - change | |
# clip to range | |
self.set_new(max(min(self.upper, new), self.lower)) | |
def set_new(self, value): | |
self.series.append(value) | |
def notify_sell(self, volume): | |
self.sold_at.append((volume, len(self.series) - 1)) | |
# name, median, upper, lower, start | |
beverages = [ | |
Beverage("Holsten", 300, 1100, 150, 150), | |
Beverage("Astra", 300, 1100, 100, 200) | |
] | |
total_profit = [] | |
volume = [] | |
for i in range(700): | |
if i % 10 == 0: | |
selected = random.choice(beverages) | |
selected.notify_sell(bev.upper // bev.current) | |
volume.append(bev.upper // bev.current) | |
else: | |
volume.append(0) | |
local_profit = 0 | |
for bev in beverages: | |
bev.tick() | |
local_profit += bev.profit | |
total_profit.append(local_profit) | |
plt.figure(0) | |
for bev in beverages: | |
plt.plot(bev.series) | |
print("Name: ", bev.name) | |
print("Volume:", bev.sell_volume) | |
print("Umsatz:", bev.sum_sold) | |
print("Gewinn:", bev.profit) | |
plt.ylabel('Price') | |
#plt.figure(1) | |
#plt.plot(total_profit) | |
#plt.ylabel('Profit') | |
plt.figure(2) | |
plt.plot(volume) | |
plt.ylabel('Volume') | |
plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment