Simulationsprogramm [5$ inside]

    • MrMatze111
      MrMatze111
      Bronze
      Dabei seit: 06.09.2006 Beiträge: 306
      Ich suche ein Programm, mit dem man einfache Simualtionen ausführen kann.

      Ich bräuchte dieses Programm um eine statistische Analyse durchführen zu können. Also ich möchte 2 Lotterien über die Zeit vergleichen. Die eine Lotterie hat einen höheren Erwartungswert, ist allerdings risikoreicher. Die andere Lotterie hat einen niedrigeren Erwartungswert, ist dafür aber nicht so risikoreich. Das Ganze muss unter der Nebenbedingung eines Budgets simuliert werden.

      Konkret: Lotterie 1: Erfolgswahrscheinlichkeit 0.6 - 3€ Gewinn Verlustwahrscheinlichkeit 0,4 - 3€ Verlust

      Lotterie 2: Erfolgswahrscheinlichkeit 0,75 - 5€ Gewinn
      Verlustwahrscheinlichkeit 0,25 - 5€ Verlust

      Budget: 9€

      Ich würde zunächst einmal den restringierten Erwartungswert für Lotterie 1 ersimulieren und danach den Erwartungswert für Lotterie 2 ersimulieren. Das Ganze Ding soll entweder nach 100 Wiederholungen abbrechen oder wenn man broke ist (Budget aufgebraucht)!

      Für eine gescheite Idee und ein passendes Simulationsprogramm, welches soetwas errechnen kann shippe ich 5$ auf Stars!

      Freu mich über jede konstruktive Anregung!
  • 37 Antworten
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.611
      Wenn du ne beliebige Programmiersprache beherrscht hast das in ungefähr 10 Minuten selber geschrieben. Wenn nicht kommt noch n Tag dazu, um die Grundzüge einer Scriptsprache zu erlernen... ;)
    • MrMatze111
      MrMatze111
      Bronze
      Dabei seit: 06.09.2006 Beiträge: 306
      Programmiersprachen beherrsche ich leider nicht... Für sowas muss es aber doch irgendein vorgefertigtes Simulationstool geben?!
    • SoWe
      SoWe
      Global
      Dabei seit: 10.01.2008 Beiträge: 2.397
      o_O das kannste doch sogar alles analytisch lösen man

      für lotterie2 dann halt mit nem effektiven budget von 5€

      wie man es löst steht zb umrissen in "the mathematics of poker" beim thema risk of ruin
    • FiftyBlume
      FiftyBlume
      Bronze
      Dabei seit: 06.06.2010 Beiträge: 8.728
      Okay, du willst also einfach nur 100x beide Varianten durchspielen lassen?

      Ich kann dir in n paar Minuten n programm dafür schreiben, aber ohne oberfläche udn so scheiß...und du bräuchtest n Compiler:)
    • MrMatze111
      MrMatze111
      Bronze
      Dabei seit: 06.09.2006 Beiträge: 306
      o_O das kannste doch sogar alles analytisch lösen man für lotterie2 dann halt mit nem effektiven budget von 5€ wie man es löst steht zb umrissen in "the mathematics of poker" beim thema risk of ruin


      Ich weiss wie man es analytisch lösen kann, allerdings muss ich es simulieren.

      Okay, du willst also einfach nur 100x beide Varianten durchspielen lassen? Ich kann dir in n paar Minuten n programm dafür schreiben, aber ohne oberfläche udn so scheiß...und du bräuchtest n Compiler


      Danke erstmal für dein Angebot. Was ich brauche ist folgendes: Ich möchte diesen sogenannten stochastischen Bernoulliprozess simulieren. Dabei muss ich variabel eingeben, was mein p ist und was mein n ist. P steht für die Erfolgswahrscheinlichkeit und 1-p dann für die Verlustwahrscheinlichkeit. n steht für die Anzahl der Wiederholungen. Darüber hinaus müssen die Auszahlungen für Erfolg/Verlust variabel sein. Wenn ein variables Budget B unterschritten wird, dann muss die Simulation abbrechen und das Ergebniss ist 0. So das wären die Bedingungen an den stochastischen Prozess. Nun soll dieser stochastische Prozess m mal durchgeführt werden und die die Ergebnisse für jeden Prozess irgendwo abgelegt werden. Aus den Ergebnissen soll dann für eine große Anzahl Wiederholungen m der Mittelwert errechnet werden, der der Schätzer des Erwartungswertes des stochastischen Prozesses sein soll!

      Beispiel:

      Lotterie 1: Erfolgswahrscheinlichkeit p=0.6, n=100 Wiederholungen der Lotterie, Budget=10, Auszahlung bei Erfolg=10, Auszahlung bei Misserfolg=-10

      Lotterie 2: Erfolgswahrscheinlichkeit p=0.6, n=100 Wiederholungen der Lotterie, Budget=10, Auszahlung bei Erfolg=10, Auszahlung bei Misserfolg=-10

      So: Lotterie 1 hat für sich genommen einen höheren Erwartungswert (E(X1)=2), allerdings ist die Wahrscheinlichkeit broke zu gehen sehr viel höher (p1(broke)=2/3). Lotterie 2 hat für sich genommen einen geringeren Erwartungswert (E(X2)=1), allerdings ist die Wahrscheinlichkeit broke zu gehen lediglich p2(broke)=4/15. Das Problem lässt sich analytisch lösen und es ergibt, dass es sinnvoller ist Lotterie 2 zu bevorzugen, weil der stochastische Prozess einen höheren EV aufweist als Lotterie 2. D.h., dass obwohl die einzelnen wiederholten unabh. Spiele der Lotterie 1 höher zu bewerten sind, ist der gesamte Prozess schlechter zu bewerten.

      Ähm ja das ist doch wohl relativ umständlich :D Erhöhe somit auf [10$] für ein brauchbares tool. Vielleicht gibt es ja sowas auch im Inet, das wäre auch schon ok!
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.611
      Lol, Aufwand... Du hast wirklich noch nie programmiert... ;)

      Kommst du irgendwie an Matlab ran? Dann tipp ich dir das schnell runter... Wenn nicht darf das gern FiftyBlume machen, kein Bock das mit ner compilierten Sprache zu machen... ;)
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.
    • FiftyBlume
      FiftyBlume
      Bronze
      Dabei seit: 06.06.2010 Beiträge: 8.728
      Original von bergi88
      verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.
      Ist doch ganz klar....ich geh mal davon aus du kannst programmieren;)

      er braucht ne schleife, die 100x durchläuft und zufällig bestimmt ob man gewinnt und verliert.

      Dabei soll p(win), Budget, Gewinnsumme/Verlustsumme frei wählbar sein.
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      Original von FiftyBlume
      Original von bergi88
      verstehe die Aufgabe immer noch nicht so wirklich. Würde das sonst gerne machen.
      Ist doch ganz klar....ich geh mal davon aus du kannst programmieren;)

      er braucht ne schleife, die 100x durchläuft und zufällig bestimmt ob man gewinnt und verliert.

      Dabei soll p(win), Budget, Gewinnsumme/Verlustsumme frei wählbar sein.
      hm glaube nicht, dass es zufällig sein soll. Du hast ja Wahrscheinlichkeiten gegeben und musst ja die Varianz einarbeiten.
      Das muss ihrgendwie über die Bestimmung des asymptotischen Konfidenzintervalles laufen. Aus diesem Intervall muss dann vllt. eine Wert zufällig gewählt werden und damit dann über die Binominalverteilung die Wahrscheinlichkeit ausrechenn zu gewinnen oder zu verlieren oder so ähnlich. Mit ner einfachen Schleife ist das sicherlich nicht getan.
    • MrMatze111
      MrMatze111
      Bronze
      Dabei seit: 06.09.2006 Beiträge: 306
      Lol, Aufwand... Du hast wirklich noch nie programmiert... Augenzwinkern Kommst du irgendwie an Matlab ran? Dann tipp ich dir das schnell runter... Wenn nicht darf das gern FiftyBlume machen, kein Bock das mit ner compilierten Sprache zu machen... Augenzwinkern


      Jau an Matlab dürfte ich rankommen. Bedenke aber bitte, dass ich die Wiederholungen n (inerhalb eines stoch.Prozesses) variabel brauche, die Wahrscheinlichkeit p variabel brauche, das Budget B variabel brauche und die Anzahl der Wiederholungen m der stoch. Prozesse variabel brauche. Es ist wichtig, dass ich die Mittelwerte der einzelnen m stochastischen Prozesse (welcher in sich nochmal n Wiederholungen hat) aufaddieren kann und daraus wiederrum nochmal den Mittelwert ziehen kann, um für m gegen unendlichen mit dem Mittelwert einen guten Schätzer für den Erwartungswert des stoch. Prozesses zu bekommen!

      Hier ist im Übrigen auch nen Ansatz zur Implementierung von Bernoulliprozessen in Matlab, vllt hilft dir das ja auch!

      http://halweb.uc3m.es/esp/Personal/personas/amalonso/esp/Matlab_Tutorial_PartII_2005.pdf
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      hm habe was programmiert. werde eben noch die Benutzereingaben reinkloppen und dann mal uppen.
    • Tobiwanknobi
      Tobiwanknobi
      Bronze
      Dabei seit: 11.06.2008 Beiträge: 114
      hier ist ein online tool
      http://www.hakank.org/sims/GamblersRuinApplet.html
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      So hier ist es. Funktioniert wie folgt: Parameter eingeben und es erfolgt die Berechnung und Ausgabe am Schirm (kann auch in Datei ausgegebn werden muss ich dann aber erst programmieren)

      interner Ablauf:

      es wird zuerst das Asymptotische Konfidenzintervall (95%) bestimmt. Diese wird auf die vorgegeben Wahrscheinlichkeit addiert und abgezogen. Wenn es addiert wird hat man die Wahrscheinlichkeit die man maximal erreicht kann. Wenn es subtrahiert wird erhält man die minimal Wahrscheinlchkeit. Mit steigenden Durchläufen werden die Schwankungen (Konfidenzintervall wird immer kleiner) immer kleiner. Wir nähern uns immer weiter unserer Schätzung an

      Ausgabe:
      Anzahl der Durchgänge | Kapital_minimal | Kapital_maximal | Asymptotische Konfidenzintervall | min Wahrscheinlichkeit zu gewinnen | max Wahrscheinlichkeit zu gewinnen
      Lotterie_110201.exe - 29.3 Kb
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.611
      Hm... Könntest du nem Statistik-Noob wie mir erklären, warum das so kompliziert sein muss? Die einzelnen "Lottoziehungen" haben doch einfach ne fixe Wahrscheinlichkeit, und gut ist. Warum sollte ich da künstlich noch ein Intervall einführen, in dem die Wahrscheinlichkeit liegt? Damit seh ich das schon so, dass sich das einfach mit zwei Schleifen lösen lässt. Dazu kommt halt nur noch, dass man aufhört, wenn man broke ist. Wobei sich die Frage stellt, ob broke für B < 0 oder für B <= 0 vorliegt. Wobei man, wenn mans genau macht, broke ist, wenn man den Einsatz nicht mehr zahlen kann.

      Wie auch immer, ich hab dir hier mal den Code in Matlab, so wie ich die Aufgabe verstanden hab (sprich: ziemlich stumpf). Parameter sollten klar sein.


      function res = sim_lotto(p,n,m,B,win,loss)

      res = 0;
      for im = 1:m
      B_akt = B;
      for in = 1:n
      if rand <= p, B_akt = B_akt + win; else, B_akt = B_akt + loss; end
      if B_akt < 0, B_akt = 0; break, end
      %if B_akt < abs(loss), break, end
      end
      res = res + B_akt;
      end
      res = res / m;

      end
      Mit der auskommentierten Zeile wird aufgehört, wenn mans ich den nächsten Einsatz nicht mehr leisten kann. Wenn irgendwo Blödsinn drinsteht, sagt Bescheid. (rand <= p sollte stimmen, da rand einen Wert aus (0,1] liefert)
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      ehrlich gesagt nein :D . Glaube auch mittlerweile das es falsch ist, aber habe jetzt keine Lust darüber nachzudenken ^^
      code:
      /*
      Lotterie_110201.c
      */
      
      #include <stdio.h>	//für das Programm notwendige Definitionsdateien einbinden
      #include <stdlib.h>
      #include <math.h>
      
      FILE 	*ausgabe;
      
      void intro(void)
      {
          puts("Lotterie Simulation\n01.02.2011\n\n");
      }
      
      double Abfrage_Bankroll(void)
      {
      	double	Bankroll;
      	char 	Einlesevariable[32];
      
      	Start_Abfrage_Bankroll:
      	puts("Bitte geben Sie den Wert Ihres Startkapitals ein (1 bis 1000)!");
      	fgets(Einlesevariable, 32, stdin);
      	Bankroll = atof(Einlesevariable);
      
      	if(Bankroll >= 1 && Bankroll <= 1000)
      	{
      		return Bankroll;
      	}
      	else
      	{
      		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
      		goto Start_Abfrage_Bankroll;
      	};
      }
      
      
      double Abfrage_Lotterie()
      {
      	double	Wahrscheinlichkeit;
      	char 	Einlesevariable[16];
      
      	Start_Abfrage_Lotterie:
      	printf("Bitte geben Sie die Gewinnwahrscheinlichkeit fuer ein Los in Prozent an!\n");
      	fgets(Einlesevariable, 16, stdin);
      	Wahrscheinlichkeit = atof(Einlesevariable);
      
      	if(Wahrscheinlichkeit > 0.001 && Wahrscheinlichkeit <= 100)
      	{
      		return Wahrscheinlichkeit;
      	}
      	else
      	{
      		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
      		goto Start_Abfrage_Lotterie;
      	};
      }
      
      double Abfrage_Preis_Lotterie()
      {
          double	Preis_Lotterie;
      	char 	Einlesevariable[16];
      
      	Start_Abfrage_Preis_Lotterie:
      	printf("Bitte geben Sie den Preis eines Loses an (zwischen 0.001 und 100)!\n");
      	fgets(Einlesevariable, 16, stdin);
      	Preis_Lotterie = atof(Einlesevariable);
      
      	if(Preis_Lotterie > 0.001 && Preis_Lotterie <= 100)
      	{
      		return Preis_Lotterie;
      	}
      	else
      	{
      		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
      		goto Start_Abfrage_Preis_Lotterie;
      	};
      
      }
      
      double Abfrage_Gewinn_Lotterie()
      {
          double	Gewinn_Lotterie;
      	char 	Einlesevariable[16];
      
      	Start_Abfrage_Gewinn_Lotterie:
      	printf("Bitte geben Sie den moeglichen Gewinn an (zwischen 0.001 und 100)!\n");
      	fgets(Einlesevariable, 16, stdin);
      	Gewinn_Lotterie = atof(Einlesevariable);
      
      	if(Gewinn_Lotterie > 0.001 && Gewinn_Lotterie <= 100)
      	{
      		return Gewinn_Lotterie;
      	}
      	else
      	{
      		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
      		goto Start_Abfrage_Gewinn_Lotterie;
      	};
      
      }
      
      
      double Abfrage_Anzahl_Simulationsvorgaenge(void)
      {
      	int	Anzahl_Simulationsvorgaenge;
      	char 	Einlesevariable[64];
      
      	Start_Abfrage_Anzahl_Simulationsvorgaenge:
      	puts("Bitte geben Sie die Anzahl Ihrer Simulationsvorgaenge an (1 bis 10000)!\n");
      	fgets(Einlesevariable, 64, stdin);
      	Anzahl_Simulationsvorgaenge = atoi(Einlesevariable);
      
      	if(Anzahl_Simulationsvorgaenge > 1 && Anzahl_Simulationsvorgaenge <= 10000)
      	{
      		return Anzahl_Simulationsvorgaenge;
      	}
      	else
      	{
      		puts("Ihre Eingabe war fehlerhaft. Bitte geben Sie den Wert erneut ein!");
      		goto Start_Abfrage_Anzahl_Simulationsvorgaenge;
      	};
      }
      
      void Ausgabe_Parameter(double Bankroll,double p_Lotterie, double Preis_Lotterie, double Gewinn_Lotterie, int Anzahl_Simulationen)
      {
          system("cls");
          printf("Die Simulation wird mit folgenden von Ihnen gewaehlten Parametern ausgefuehrt!\n");
          printf("Bankroll:\t%5.2lf\n", Bankroll);
          printf("Wahrscheinlichkeit:\t%2.2lf\n", p_Lotterie);
          printf("Preis pro Los:\t%4.2lf\n", Preis_Lotterie);
          printf("Gewinn pro Los:\t%4.2lf\n", Gewinn_Lotterie);
          printf("Durchgaenge:\t%d\n", Anzahl_Simulationen);
          system("PAUSE");
      }
      double Berechnung_Intervall(double p, int i)
      {
          double  Intervall   = 0;
      
          Intervall = 1.65*sqrt((p*(1-p))/i);
          return Intervall;
      }
      
      
      double Berechnung_Bankroll(double Bankroll, double p, double Preis, double Gewinn)
      {
          if (p > 0 && p <= 1)
          {
              Bankroll = Bankroll - Preis + (p*Gewinn);
              return Bankroll;
          }
          if (p > 1)
          {
              Bankroll = Bankroll - Preis + Gewinn;
              return Bankroll;
          }
          if (p <= 0)
          {
              Bankroll = Bankroll - Preis;
              return Bankroll;
          }
      
      }
      
      
      void Ausgabe_Daten(int Durchlauf, double Bankroll_konservativ, double Bankroll_optimal, double Intervallgrenze, double p_konservativ, double p_optimal)
      {
          printf("%d\t%5.2lf\t%5.2lf\t%2.2lf\t%2.2lf\t%2.2lf\t\n",  Durchlauf, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
      //    fprintf(ausgabe, "%d\t%5.2lf\t%5.2lf\t%2.2lf\t%2.2lf\t%2.2lf\t\n",  Durchlauf, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
      }
      
      
      void Simulation(double Bankroll, double p_Lotterie, double Preis, double Gewinn, int Anzahl_Simulationen)
      {
          double  Intervallgrenze = 0,
                  Bankroll_konservativ    = 0,
                  Bankroll_optimal        = 0,
                  p_konservativ   = 0,
                  p_optimal       = 0;
          int     i   = 1;
      
          Bankroll_konservativ = Bankroll;
          Bankroll_optimal = Bankroll;
          char dateiname[] = "ausgabe.dat";
      	ausgabe = fopen(dateiname, "w");
          do
          {
              Intervallgrenze = Berechnung_Intervall(p_Lotterie, i);
              p_konservativ = p_Lotterie - Intervallgrenze;
              p_optimal = p_Lotterie + Intervallgrenze;
              Bankroll_konservativ    = Berechnung_Bankroll(Bankroll_konservativ, p_konservativ, Preis, Gewinn);
              Bankroll_optimal        = Berechnung_Bankroll(Bankroll_optimal, p_optimal, Preis, Gewinn);
              Ausgabe_Daten(i, Bankroll_konservativ, Bankroll_optimal, Intervallgrenze, p_konservativ, p_optimal);
              i = i++;
          }
          while (i < (Anzahl_Simulationen+1));
          fclose(ausgabe);
      }
      
      
      int main(void)
      {
          double  Bankroll            = 0,
                  p_Lotterie          = 0,
                  Preis_Lotterie      = 0,
                  Gewinn_Lotterie     = 0;
          int    Anzahl_Simulationen  = 1000;
      
          intro();
          Bankroll = Abfrage_Bankroll();
          p_Lotterie = Abfrage_Lotterie();
          Preis_Lotterie = Abfrage_Preis_Lotterie();
          Gewinn_Lotterie = Abfrage_Gewinn_Lotterie();
          Anzahl_Simulationen = Abfrage_Anzahl_Simulationsvorgaenge();
          Ausgabe_Parameter(Bankroll,p_Lotterie, Preis_Lotterie, Gewinn_Lotterie, Anzahl_Simulationen);
          Simulation(Bankroll, p_Lotterie / 100, Preis_Lotterie, Gewinn_Lotterie, Anzahl_Simulationen);
          system("PAUSE");
          return 0;
      }
      
      


      Hier mal mein Quellcode
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.611
      Und darum nutz ich für so was nur noch Scriptsprachen... ;)
    • bergi88
      bergi88
      Bronze
      Dabei seit: 08.09.2009 Beiträge: 292
      :D . Habe leider kein MatLab zu Hause.
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.611
      Hab mir kurz überlegt, das in Perl zu tippen... :D

      Aber da is die Wahrscheinlichkeit auch eher gering, dass ers ausführen kann, und noch viel geringer, dass er kleine Modifikationen ausprobiert...


      Kann aber wie gesagt nur empfehlen, ne Scriptsprache zu lernen, falls man öfter mal solche Sachen braucht. Matlab ist für Numerik gut geeignet, auch wenn ich die Sprache hässlich find. Ansonsten würd ich als Allrounder Python empfehlen. (Und btw: Es gibt mit Octave nen freien Matlab-Clon, der für kleine Programme gar nicht mal so schlecht ist.)
    • MrMatze111
      MrMatze111
      Bronze
      Dabei seit: 06.09.2006 Beiträge: 306
      Wow hier ist viel passiert, werde mir gleich mal eure Tools ansehen! Melde mich dann wieder...

      broke ist, wenn B<=0 ist!
    • 1
    • 2