Betriebswirtschaftliche Simulation mit Python – was wäre wenn

In diesem Artikel werde ich eine Möglichkeit aufzeigen, mit der Programmiersprache Python betriebswirtschaftliche Situationen zu simulieren.
Im Gegensatz zu den aus der Investitionsrechnung (BWL) bekannten Rechnungen beherrscht die hier vorgestellte Methode wesentlich komplexere Szenarien. Trotz der weitaus komplexeren Szenarien, die man simulieren kann, bleibt diese Methode recht einfach in ihren Werkzeugen.

Die Grundidee

Der Grundsatz der betriebswirtschaftlichen Simulation ist, die Auswirkungen von Entscheidungen abschätzen zu können. Unter Auswirkungen versteht man vor allem Kapitalflüsse. Der Unternehmer oder Controller ist daran interessiert, zu erfahren, welche Entscheidung die mometär lohnenswerteste ist. Er will für jede seiner Entscheidungsvarianten wissen, wie viel Gewinn bzw. Verlust er damit macht. Unter Entscheidungen versteht man vom Unternehmer bzw. Controller frei wählbare Möglichkeiten des Handelns, die Auswirkungen auf die Kapitalflüsse der Firma haben.

Beispielsweise kann sich ein Unternehmen entscheiden, eine neue Maschine anzuschaffen (Anschaffungskosten), die anschließend effektiver arbeitet (niedrigere Herstellungskosten, höhere Produktionsmenge). Es gibt somit 2 Möglichkeiten: Die Maschine anzuschaffen und die Maschine durch die Einsparungen abzubezahlen oder die alte Maschine zu behalten und mit den hohen Produktionskosten weiterleben.

Python

Python ist eine leicht erlernbare Programmiersprache, die insbesondere bei Wissenschaftlern beliebt ist, da sie numerische Berechnungen gut beherrscht. Wie man Python installiert bzw. zum Laufen bekommt, werde ich hier nicht schildern. Allerdings gibt es, Google sei dank, genug andere Anleitungen online.

Das Grundgerüst

Bei den dynamischen Verfahren der Investitionsrechnung spielt der Faktor Zeit eine große Rolle. Natürlich ist unser Datumssystem recht komplex und beinhaltet Schaltjahre, unterschiedlich lange Monate und vieles mehr. Betriebswirte arbeiten aber meist mit einem verreinfachten Modell und unterteilen ihre Kalkulation in sogenannte Perioden. Eine Periode kann ein Monat, ein Quartal, ein Jahr oder ein Arbeitstag sein. Um eine Periode zu identifizieren, vergeben wir einfach aufsteigende Nummern mit 0 beginnend. Für unser Beispiel teilen wir die Zeit in 1 Monat lange Perioden legen uns die folgende Hilfsfunktion in Python an:

from datetime import date
from dateutil.relativedelta import relativedelta

def toDate(x):
   return (date(2015, 9, 1) + relativedelta(months=x)).strftime('%b %Y')

Nicht vergessen: die Einrückung in der Funktion, ansonsten funktioniert das Programm nicht. Fügen wir jetzt print toDate(0) als letzte Zeile (ohne Einrückung) in das Programm, erhalten wir folgende Ausgabe:
Sept 2015

Somit entspricht Periode 0 dem Sept 2015, Periode 1 dem Okt 2015 und Periode 4 dem Jan 2016. Mit der Funktion toDate können wir also künftig unsere interne Nummerierung bequem in eine lesbare Version für Ausgaben umwandeln.

Der Zeitverlauf

Simulationen werden erst durch den Zeitverlauf interessant. Der Vorteil an Simulationen ist, dass man auch Ereignisse simulieren kann, die von anderen Faktoren abhängen. Doch zuerst das einfachste Beispiel:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import date
from dateutil.relativedelta import relativedelta

def toDate(x):
   return (date(2015, 9, 1) + relativedelta(months=x)).strftime('%b %Y')

konto = 1000
for zeit in range(0, 12):
   einnahmen = 100
   konto += einnahmen

   print toDate(zeit), ':'
   print 'Einnahmen = ', einnahmen
   print 'Kontostand = ', konto
   print ''


Ausgabe von Python:

Sep 2015 :
Einnahmen = 100
Kontostand = 1100

Oct 2015 :
Einnahmen = 100
Kontostand = 1200

Nov 2015 :
Einnahmen = 100
Kontostand = 1300

Dec 2015 :
Einnahmen = 100
Kontostand = 1400

Jan 2016 :
Einnahmen = 100
Kontostand = 1500

Feb 2016 :
Einnahmen = 100
Kontostand = 1600

Mar 2016 :
Einnahmen = 100
Kontostand = 1700

Apr 2016 :
Einnahmen = 100
Kontostand = 1800

May 2016 :
Einnahmen = 100
Kontostand = 1900

Jun 2016 :
Einnahmen = 100
Kontostand = 2000

Jul 2016 :
Einnahmen = 100
Kontostand = 2100

Aug 2016 :
Einnahmen = 100
Kontostand = 2200

Was wir hier einsetzen ist eine Zählschleife per for zeit in range(0, 12):. Es wird die Variable zeit von 0 bis 11 hochgezählt. Dabei setzen wir die Variable einkommen und addieren diese auf die Variable konto. Anschließend werden Zeitpunkt, Einnahmen und Kontostand auf dem Bildschirm ausgedruckt.

Auf diese Art und Weise simulieren wir einen kontinuierlichen Geldzufluss.

Varianten

Gibt es mehrere Möglichkeiten, sich zu entscheiden, gilt es, alle Varianten zu simulieren und anschließend die beste anschließend anhand einer Bewertung auszugeben. Das Grundgerüst dafür ist:

entscheidung_ob_neue_maschine = -1
bewertung_der_entscheidung = -10000
for ob_neue_maschine in range(0, 2):
   # .... Berechnung der Entscheidung (in Abhängigkeit von ob_neue_maschine)
   bewertung = ...

   # entscheiden, ob gefundene Bewertung besser ist als bisherige
   if bewertung > bewertung_der_entscheidung:
      bewertung_der_entscheidung = bewertung
      entscheidung_ob_neue_maschine = ob_neue_maschine

print 'Beste Entscheidung: ', entscheidung_ob_neue_maschine
print 'Bewertung der besten Entscheidung: ', bewertung_der_entscheidung

An der Stelle „Berechnung der Entscheidung“ fügt man dann seine Zeitreihe ein, um die Bewertung (z.B. Kontostand nach Ablauf des Zeitraumes) zu berechnen. Die if-Entscheidung prüft anschließend, ob die aktuell berechnete Bewertung „die Highscore knackt“. Zum Schluss wird nur noch das beste Ergebnis ausgegeben.

Varianten lassen sich natürlich verschachteln. So lässt sich beispielsweise über dem „Einführungsdatum des neuen Produkts“ und gleichzeitig dem „Zeitpunkt der ersten Preissenkung“ variieren. Da der Erfolg des Unternehmens von beiden Faktoren abhängt, muss man alle Varianten durchspielen. Doch Vorsicht: Gibt es 10 mögliche Einführungsdaten und 10 mögliche Zeitpunkt der ersten Preissenkung, werden schon 100 Varianten durchgerechnet. Mit jedem weiteren Faktor vervielfacht sich die Variantenvielfalt. Ab einem gewissen Punkt kommt also der Rechner nicht mehr mit der Berechnung hinterher.

Primitiven der Simulation

Geldfluss, Materialfluss etc.

Einen Geldfluss simuliert man sehr simpel mit einer Berechnung:
einkommen += 400 # Verkäufe
einkommen -= 300 # Miete

Man erhöht die Variable „einkommen“ um 400 Einheiten aufgrund der Verkäufe, sowie zieht wieder 300 Einheiten aufgrund der Miete ab. De Fakto werden also 100 Einheiten aufaddiert. Wir programmieren die Simulation allerdings so umständlich, da wir natürlich unseren Code noch verstehen und nachvollziehen können wollen.

Bedingter Geldfluss oder Materialfluss

Hängt ein Geldfluss von einer Bedingung ab, wird das wie folgt programmiert:
if ob_neue_maschine == 1: # Wenn gerade Variante mit Maschine simuliert wird ...
   einkommen -= 100 # ... kommen monatliche Kosten von 100 auf uns zu

Ein anderes Beispiel ist etwas komplexer und bezieht sich auf zeitliche Abhängigkeiten:
if zeit >= einfuehrungs_datum: # Wenn simulierter Zeitpunkt nach dem Einführungsdatum liegt ...
   einkommen += 400 # ... dann werden die Einnahmen hinzugerechnet

Dadurch bekommen die Variationen überhaupt erst einen Sinn. Durch die Unterscheidungen je nach Variante werden unterschiedliche Auswirkungen erzeugt, die die Bewertung einer Variante beeinflussen.

Materialfluss-Nebenrechnung

Um komplexere Situationen zu simulieren, ist es manchmal hilfreich, Nebenrechnungen durchzuführen. So kann eine Softwareentwicklungsfirma zuerst simulieren, wieviel Arbeitskapazität sie aufgrund der Anzahl ihrer Mitarbeiter hat. Die Einnahmen können dann anhand der errechneten Arbeitskapazität simuliert werden. Beispiel:
produktionsmenge = 100
if ob_neue_maschine == 1: # Wenn gerade Variante mit neuer Maschine simuliert wird ....
   produktionsmenge = 300 # ... dann wird die Produktionsmenge überschrieben
einkommen += produktionsmenge * 4 # Abverkauf aller Erzeugnisse mit 4 Eur pro Stück

Durch die Nebenrechnung mit dem Materialfluss wird der Code der Simulation viel lesbarer.

Grafische Darstellung der Ergebnisse

Es macht durchaus Sinn, sich die Ergebnisse der Simulation auch greifbarer darzustellen, beispielsweise als Diagramm. Dies erreichen wir, indem wir während der Simulation einfach die Simulationspunkte als CSV herausschreiben. Das CSV kann anschließend mit Libreoffice Calc oder mit Microsoft Excel in ein Diagramm umgewandelt werden. Für das Beispiel mit dem Kontostand und dem Einkommen, sähe das Diagramm so aus:
diag

Fazit

Wer als Betriebswirt genau nachrechnen will, welche Entscheidung welche monetäre Auswirkung hat und welche Entscheidung aus dem 2-, 4- oder 100-dimensionalen Entscheidungsraum er wählen soll, sollte sich etwas mit Python beschäftigen. Wer nicht zu tief in die Programmierung einsteigen will, aber trotzdem seine Situationen genau simulieren will, kann sich auch einen privaten Python-Programmierer anheuern, der ihm auf Diktat alle Rahmenbedingungen auswertet. Der Python-Programmierer wandelt die Vorgaben des Entscheiders in Code um, lässt das Programm simulieren und teilt Ihnen mit „Sie sollten im März die Maschine B durch Maschine F ablösen, das ist die effektivste Möglichkeit“. Nun haben Sie on-the-fly die Möglichkeit, zu sagen: „Das Ergebnis ist ja komisch, eigentlich ist doch Maschine E effektiver, da sie weniger Rüstzeiten hat“ – schon wird der Python-Programmierer auch die Nebenrechnung der Rüstzeiten in die Simulation aufnehmen. Auf diese Art und Weise haben Sie in 1-2 Stunden mit Hilfe eines Programmierers Ihre Entscheidung auf eine fundierte Art und Weise gefunden.

Autor: Carl-Philip Hänsch

Ich bin Softwareentwickler im Bereich Web, Multimedia und Bürokommunikation. Dabei liegt mein Schwerpunkt in der Systemarchitektur, Systemprogrammierung und Backends (z.B. Datenbanken). Mit meiner Softwarefirma helfe ich Unternehmen, ihre Daten zu strukturieren und aufzubereiten.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.


Newsletter abonnieren (Jederzeit wieder abbestellbar)

Durch das Fortsetzen der Benutzung dieser Seite, stimmst du der Benutzung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen", um Ihnen das beste Surferlebnis möglich zu geben. Wenn Sie diese Website ohne Änderung Ihrer Cookie-Einstellungen zu verwenden fortzufahren, oder klicken Sie auf "Akzeptieren" unten, dann erklären Sie sich mit diesen.

Schließen