Immer gleiche ergebniss bei einer simulation?

mein programm sieht wie folgt aus:
sim. 1 sim. 2 … sim. 1000
tag 1
tag 2
.
.
.tag22

es geht um kursverläufe eines aktienindizes. sim. 1 bis 3 funktioniert wunderbar und ich bekomme unterschiedliche ergebnisse.
von sim. 4 bis 1000 habe ich überall exakte (also für jeden tag!!!) die gleichen werte stehen.

woran liegt das?? jemand eine idee??

besten dank!!

Hallo Daro,

es geht um kursverläufe eines aktienindizes. sim. 1 bis 3
funktioniert wunderbar und ich bekomme unterschiedliche
ergebnisse.
von sim. 4 bis 1000 habe ich überall exakte (also für jeden
tag!!!) die gleichen werte stehen.

woran liegt das?? jemand eine idee??

ja, wird am Programmcode liegen.
Wahrscheinlich in Codezeile 5 das Trennkomma vergessen, üblicher Fehler.

Gruß
Reinhard

-)

codezeile 5??? kannst du etwa mein programm sehen :smile:)

bin kein vba experte; daher folgende frage:
wo oder was ist codezeile 5??

ich würde ja sonst meine codes hier rein stellen, aber das wäre viel zu viel und fremde gedankengänge nachzuvolziehen ist viel zu aufwändig…wie kann ich also konkret den fehler beheben? wieso macht funktionieren die ersten simulationen??

Hallo erstmal

von sim. 4 bis 1000 habe ich überall exakte (also für jeden
tag!!!) die gleichen werte stehen.

woran liegt das?? jemand eine idee??

Ohne Quellcode hilft wirklich nur Zeile 5 weiter :wink: Alternativ die Glaskugel
Aber ein Rateversuch: ab Sim 5 wird immer derselbe Startwert angenommen, was bei gleichem Algorithmus immer dieselben Endwerte produziert.

mfg M.L.

Hallo,

*gg* Reinhard wollte Dir sagen, daß Dir Niemand helfen kann, wenn Du den Code nicht zeigst.

Wir können unmöglich erraten, was Du wo falsch gemacht hast.

Gruß Rainer

ich stell jetzt mal den code der berechnung rein…wird wahrscheinlich ziemlich unübersichtlich, aber evtl ist ja jemand so erfahren, dass er sofort sieht, was hier falsch läuft…

z = kapital
For t = 1 To tage
zufall = (my + sigma * Application.WorksheetFunction.NormSInv(Rnd()))
vermögen = ((aktienquote) * z) * (1 + zufall) + (festquote * z * (1 + festzins))
z = vermögen

a = 0
If zufall 1 Then
festquote = 1
End If

Pfad(t) = z

Next t 'nächster tag

Hallo,

füge mal eine Zeile ein …

z = kapital

Randomize Timer

For t = 1 To tage
zufall = (my + sigma *
Application.WorksheetFunction.NormSInv(Rnd()))
vermögen = ((aktienquote) * z) * (1 + zufall) + (festquote
* z * (1 + festzins))
z = vermögen

Gruß Rainer

ich stell jetzt mal den code der berechnung rein…wird wahrscheinlich ziemlich unübersichtlich, aber evtl ist ja jemand so erfahren, dass er sofort sieht, was hier falsch läuft…

z = kapital
For t = 1 To tage
zufall = (my + sigma * Application.WorksheetFunction.NormSInv(Rnd()))
vermögen = ((aktienquote) * z) * (1 + zufall) + (festquote * z * (1 + festzins))
z = vermögen

a = 0
If zufall 1 Then
festquote = 1
End If

Pfad(t) = z

Next t 'nächster tag

keine änderung…hab es an verschiedene stellen gesetzt, aber alles beim alten

Hallo,

OK, etwas anderes kann ich Deinem Code so nicht ansehen.
Die Prozedur ist aber unvollständig.
Eine Prozedur fängt immer mit … Sub …() an und endet mit End Sub.

Wenn der Fehler dort liegt, sehen wir ihn nicht.

Testen kann ich leider nicht, Dein Code ist VB A , das habe ich nicht. :frowning: Ich müsste den Code nach VB umschreiben und würde dabei eventuell Deinen Fehler unbemerkt entfernen.

Ich verabschiede mich wieder und überlasse Reinhard die Arbeit. :smile:

Gruß Rainer

sub und end sub gibt es auch…hab nur berechnungscode aufgeschrieben…

das ist aber ärgerlich, da verabschiedet sich schon der erste helfer :wink:

trotzdem danke!!!

OT WorksheetFunction.NormSInv(Rnd())
Hallo Interessierte,

falls es wichtig ist, dahinter verbirgt sich die Excel-Funktion StandNormInv und RND() ist ja in VB gleich wie in Excel-Vba

Nachfolgend aus F1 zitiert.

@Daro, benutze bitte beim Code Einrückungen, siehe FAQ:3090
WEnn mögliche komplette Subs zeigen die lauffähig sind und wo du My, sigma usw. mit Werten belegst.

Gruß
Reinhard, der gar nicht wissen will was die Quantile der Standardnormalverteilung sein sollen :smile:

STANDNORMINV
Liefert Quantile der Standardnormalverteilung. Die
Standardnormalverteilung hat einen Mittelwert von 0 und eine
Standardabweichung von 1.

Syntax

STANDNORMINV (Wahrsch)

Wahrsch ist die zur Standardnormalverteilung gehörige Wahrscheinlichkeit.

Hinweis
· Ist Wahrsch kein numerischer Ausdruck, liefert STANDNORMINV den Fehlerwert #WERT!.

· Ist Wahrsch 1, liefert NORMINV den Fehlerwert #ZAHL!.

STANDNORMINV verwendet zur Berechnung der Funktion ein Iterationsverfahren.
Ausgehend von der angegebenen Wahrscheinlichkeit führt STANDNORMINV
solange Iterationsschritte aus, bis das Ergebnis mit einer Abweichung
von höchstens ±3x10^-7 vorliegt.
Konvergiert STANDNORMINV nicht innerhalb von 100 Iterationsschritten,
liefert die Funktion den Fehlerwert #NV.

Beispiel

STANDNORMINV(0,908789) ergibt 1,3333

Hallo Daro,

das Einrückungen hatte ich mir so vorgestellt. Ich habe das jetzt per Makro eingerückt, k.A. ob alles perfekt eingerückt wurde.

Option Explicit
'
Sub zusatz\_fondsvermögen(zusatz\_faktor As Integer, zusatz\_tage As Integer, zusatz\_my As Double, zusatz\_sigma As Double, Pfad() As Double, zusatz\_aktienquote As Double, zusatz\_festquote As Double, zusatz\_festzins As Double, zusatz\_kapital As Double)
Dim t As Integer
ReDim Pfad(0 To zusatz\_tage)
Dim z As Double
Dim zusatz\_vermögen As Double
Dim a As Double
Dim f As Double
Dim zusatz\_zufall As Double
z = zusatz\_kapital
For t = 1 To zusatz\_tage
 zusatz\_zufall = (zusatz\_my + zusatz\_sigma \* Application.WorksheetFunction.NormSInv(Rnd()))
 zusatz\_vermögen = ((zusatz\_aktienquote) \* z) \* (1 + zusatz\_zufall) + (zusatz\_festquote \* z \* (1 + zusatz\_festzins))
 z = zusatz\_vermögen
 a = 0
 If zusatz\_zufall 1 Then
 zusatz\_festquote = 1
 End If
 Pfad(t) = z
Next t
End Sub
'
Sub Ausgabe\_zusatz\_Pfad()
Dim zusatz\_abzeile As Integer
Dim zusatz\_abspalte As Integer
Dim zusatz\_tage As Integer
Dim zusatz\_my As Double
Dim zusatz\_sigma As Double
Dim Pfad() As Double
Dim zusatz\_aktienquote As Double
Dim zusatz\_festquote As Double
Dim zusatz\_festzins As Double
Dim zusatz\_kapital As Double
Dim zusatzaufgabe As String
Dim zusatz\_garantie As Double
Dim zusatz\_vermögen As Double
Dim zusatz\_sim As Integer
Dim zusatz\_faktor As Integer
Dim f As Double
Dim a As Double
Dim t As Integer
Dim m As Integer
Dim zusatz\_zufall As Double
Application.ScreenUpdating = False
zusatz\_abzeile = 10
zusatz\_abspalte = 6
Worksheets("zusatzaufgabe").Range(Cells(zusatz\_abzeile - 1, zusatz\_abspalte), Cells(zusatz\_abzeile + 10000, zusatz\_abspalte + 10000)).ClearContents
zusatz\_sim = Worksheets("zusatzaufgabe").Cells(15, 2).Value
zusatz\_tage = Worksheets("zusatzaufgabe").Cells(11, 2).Value
zusatz\_kapital = Worksheets("zusatzaufgabe").Cells(7, 2).Value
zusatz\_festzins = Worksheets("zusatzaufgabe").Cells(16, 2).Value
zusatz\_aktienquote = Worksheets("zusatzaufgabe").Cells(10, 2).Value
zusatz\_festquote = Worksheets("zusatzaufgabe").Cells(17, 2).Value
zusatz\_my = Worksheets("zusatzaufgabe").Cells(18, 2).Value
zusatz\_sigma = Worksheets("zusatzaufgabe").Cells(19, 2).Value
zusatz\_garantie = Worksheets("zusatzaufgabe").Cells(8, 2).Value
zusatz\_faktor = Worksheets("zusatzaufgabe").Cells(6, 2).Value
If zusatz\_tage \> 22 Then
 MsgBox (" Lieber Herr XXX; auch Börsianer würden gern mal ihr Wochenende genießen!!Bitte geben Sie daher für Börsentage/Monat eine Zahl zwischen 1 und 22 ein. ")
End If
If zusatz\_tage \> 22 Then
 zusatz\_tage = 0
 zusatz\_kapital = 0
 zusatz\_festzins = 0
 zusatz\_aktienquote = 0
 zusatz\_festquote = 0
 zusatz\_my = 0
 zusatz\_sigma = 0
 zusatz\_garantie = 0
End If
If zusatz\_sim \> 1000 Then
 MsgBox ("Herr XXX, wir sind es wieder! Bitte wählen Sie für die Anzahl der Simulation\_einen Wert zwischen 1 und 1000 aus.Sie können beispielsweise die Aktienquote auf 100% erhöhen und das Sigma auf 0 setzen um unser Programm zu überprüfen")
End If
If zusatz\_sim \> 1000 Then
 zusatz\_tage = 0
 zusatz\_kapital = 0
 zusatz\_festzins = 0
 zusatz\_aktienquote = 0
 zusatz\_festquote = 0
 zusatz\_my = 0
 zusatz\_sigma = 0
 zusatz\_garantie = 0
 zusatz\_sim = 1
End If
For m = 1 To zusatz\_sim
 Call zusatz\_fondsvermögen(zusatz\_faktor, zusatz\_tage, zusatz\_my, zusatz\_sigma, Pfad(), zusatz\_aktienquote, zusatz\_festquote, zusatz\_festzins, zusatz\_kapital)
 For t = 1 To zusatz\_tage
 Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile + t, zusatz\_abspalte + m - 1).Value = Pfad(t)
 Next t
 zusatz\_vermögen = Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile + zusatz\_tage, zusatz\_abspalte + m - 1).Value
 Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile - 1, zusatz\_abspalte + m - 1).Value = (zusatz\_kapital \* zusatz\_garantie) - zusatz\_vermögen
 If (zusatz\_kapital \* zusatz\_garantie) - zusatz\_vermögen 1 Then
 zusatz\_festquote = 1
 End If
 Pfad(t) = z
Next t
End Sub
'
Sub Ausgabe\_zusatz\_Pfad()
Dim zusatz\_abzeile As Integer
Dim zusatz\_abspalte As Integer
Dim zusatz\_tage As Integer
Dim zusatz\_my As Double
Dim zusatz\_sigma As Double
Dim Pfad() As Double
Dim zusatz\_aktienquote As Double
Dim zusatz\_festquote As Double
Dim zusatz\_festzins As Double
Dim zusatz\_kapital As Double
Dim zusatzaufgabe As String
Dim zusatz\_garantie As Double
Dim zusatz\_vermögen As Double
Dim zusatz\_sim As Integer
Dim zusatz\_faktor As Integer
Dim f As Double
Dim a As Double
Dim t As Integer
Dim m As Integer
Dim zusatz\_zufall As Double
Application.ScreenUpdating = False
zusatz\_abzeile = 10
zusatz\_abspalte = 6
Worksheets("zusatzaufgabe").Range(Cells(zusatz\_abzeile - 1, zusatz\_abspalte), Cells(zusatz\_abzeile + 10000, zusatz\_abspalte + 10000)).ClearContents
zusatz\_sim = Worksheets("zusatzaufgabe").Cells(15, 2).Value
zusatz\_tage = Worksheets("zusatzaufgabe").Cells(11, 2).Value
zusatz\_kapital = Worksheets("zusatzaufgabe").Cells(7, 2).Value
zusatz\_festzins = Worksheets("zusatzaufgabe").Cells(16, 2).Value
zusatz\_aktienquote = Worksheets("zusatzaufgabe").Cells(10, 2).Value
zusatz\_festquote = Worksheets("zusatzaufgabe").Cells(17, 2).Value
zusatz\_my = Worksheets("zusatzaufgabe").Cells(18, 2).Value
zusatz\_sigma = Worksheets("zusatzaufgabe").Cells(19, 2).Value
zusatz\_garantie = Worksheets("zusatzaufgabe").Cells(8, 2).Value
zusatz\_faktor = Worksheets("zusatzaufgabe").Cells(6, 2).Value
If zusatz\_tage \> 22 Then
 MsgBox (" Lieber Herr Goecke; auch Börsianer würden gern mal ihr Wochenende genießen!!Bitte geben Sie daher für Börsentage/Monat eine Zahl zwischen 1 und 22 ein. ")
End If
If zusatz\_tage \> 22 Then
 zusatz\_tage = 0
 zusatz\_kapital = 0
 zusatz\_festzins = 0
 zusatz\_aktienquote = 0
 zusatz\_festquote = 0
 zusatz\_my = 0
 zusatz\_sigma = 0
 zusatz\_garantie = 0
End If
If zusatz\_sim \> 1000 Then
 MsgBox ("Herr Goecke, wir sind es wieder! Bitte wählen Sie für die Anzahl der Simulation\_einen Wert zwischen 1 und 1000 aus.Sie können beispielsweise die Aktienquote auf 100% erhöhen und das Sigma auf 0 setzen um unser Programm zu überprüfen")
End If
If zusatz\_sim \> 1000 Then
 zusatz\_tage = 0
 zusatz\_kapital = 0
 zusatz\_festzins = 0
 zusatz\_aktienquote = 0
 zusatz\_festquote = 0
 zusatz\_my = 0
 zusatz\_sigma = 0
 zusatz\_garantie = 0
 zusatz\_sim = 1
End If
For m = 1 To zusatz\_sim
 Call zusatz\_fondsvermögen(zusatz\_faktor, zusatz\_tage, zusatz\_my, zusatz\_sigma, Pfad(), zusatz\_aktienquote, zusatz\_festquote, zusatz\_festzins, zusatz\_kapital)
 For t = 1 To zusatz\_tage
 Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile + t, zusatz\_abspalte + m - 1).Value = Pfad(t)
 Next t
 zusatz\_vermögen = Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile + zusatz\_tage, zusatz\_abspalte + m - 1).Value
 Worksheets("zusatzaufgabe").Cells(zusatz\_abzeile - 1, zusatz\_abspalte + m - 1).Value = (zusatz\_kapital \* zusatz\_garantie) - zusatz\_vermögen
 If (zusatz\_kapital \* zusatz\_garantie) - zusatz\_vermögen 

Gruß
Reinhard

danke!! evtl. kann ja jetzt einer das problem entdecken…

Ich sehe doppelt

danke!! evtl. kann ja jetzt einer das problem entdecken…

Hallo daro,

in meinem Posting sind ja zwei prozeduren jeweils doppelt. K.A. woher das kam.

Ist es da egal welche doppelten ich lösche?

Und, im Code liest du ja Zellwerte ein. Mir wäre es lieb du bastelst eine Beispielmappe wo diejenigen Zellen aufgefüllt sind.
Als Ergebnis, wenn ich die eine Sub starte sol dann so eine Ergebis da stehen wie du in deinem Anfangsposting hattest.

Sonst teste ich wie blöde mit 67 in Zelle xyz herum, alles klappt usw.
Danst ist es mir viel lieber ich weiß exakt was du in Zelle xyz stehen hast.

Zu deinen Variablennamen, da es ja im ganzen Code immer um „zusatz“ geht kannst du das auch weglassen. Macht nur Sinn wenn es im gleichen Code auch um absatz", „umsatz“ usw. ginge.

Besser wäre du schaust mal bei wikipedia oder sonst im Internet nach „ungrischer Notation“ bzw. präfixen.

Also nicht

zusatz_sim als Namen, sondern
intSim
dblVermögen

Benutze innerhalb einer Msgbox „& Chr(13) &“ um Zeilen zu trennen wenn sie zu lang werden.

Und im Code vor Erreichen der Fenstergrenze " _ " und Enter um eine lange Zeile die zusammengehört nur optisch zu trennen.
Zu breiter Code läßt sich mies lesen.

If zusatz_tage > 22 Then
MsgBox (" Lieber Herr XXX; auch Börsianer würden gern mal ihr Wochenende genießen!!Bitte geben Sie daher für Börsentage/Monat eine Zahl zwischen 1 und 22 ein. ")
End If
If zusatz_tage > 22 Then
zusatz_tage = 0
zusatz_kapital = 0
zusatz_festzins = 0
zusatz_aktienquote = 0
zusatz_festquote = 0
zusatz_my = 0
zusatz_sigma = 0
zusatz_garantie = 0
End If
If zusatz_sim > 1000 Then
MsgBox („Herr XXX, wir sind es wieder! Bitte wählen Sie für die Anzahl der Simulation_einen Wert zwischen 1 und 1000 aus.Sie können beispielsweise die Aktienquote auf 100% erhöhen und das Sigma auf 0 setzen um unser Programm zu überprüfen“)
End If
If zusatz_sim > 1000 Then
zusatz_tage = 0
zusatz_kapital = 0
zusatz_festzins = 0
zusatz_aktienquote = 0
zusatz_festquote = 0
zusatz_my = 0
zusatz_sigma = 0
zusatz_garantie = 0
zusatz_sim = 1
End If

läßt sich kürzen auf:

If zusatz_tage > 22 Or zusatz_sim > 1000 Then
zusatz_tage = 0
zusatz_kapital = 0
zusatz_festzins = 0
zusatz_aktienquote = 0
zusatz_festquote = 0
zusatz_my = 0
zusatz_sigma = 0
zusatz_garantie = 0
End If
If zusatz_sim > 1000 Then MsgBox („Herr XXX, wir sind…“)
If zusatz_tage > 22 Then MsgBox (" Lieber Herr XXX; …")

Und, das ist kein völliges Niedermachen deines Codes meinerseits. Erstens nicht „völlig“, da ich noch gar nicht alles dazu gesagt habe *lächel*

Zweitens, ernster gemeint, wenn du vieles von dem umsetzt was ich sagte bist du fitter geworden um hier schneller Hilfe zu bekommen.

Keine Sorge, ich kann schon sehen welche Arbeit in dem Code steckt.

Gruß
Reinhard

http://rapidshare.com/files/210385011/Projekt_4.xlsm…

http://rapidshare.com/files/210385011/Projekt_4.xlsm…

Hallo Daro,

sorry, xlsm kann mein XL97 nicht so einfach lesen.

Lade es halt nochmal hoch als xls.

Gruß
Reinhard

http://rapidshare.com/files/210404081/Projekt_4.xls…

so, jetzt aber :smile:

Hallo Fragewurm,

http://rapidshare.com/files/210404081/Projekt_4.xls…

so, jetzt aber :smile:

so gehts auch :smile:

Dein Fehler liegt hier:

a = 0
If zusatz\_zufall zusatz\_aktienquote = zusatz\_aktienquote + a
End If

If zusatz\_aktienquote zusatz\_festquote = zusatz\_festquote + f
End If

zusatz_aktienquote und zusatz_festquote können nur kleiner werden. Sind sie erst einmal auf 0, passiert nichts mehr!

Da fehlt wohl etwas, wenn zusatz_zufall > 0 ist.

MfG Peter(TOO)

Hallo Peter,

zusatz_zufall ist die kursentwicklung eines indizes.
fällt der index, dann wird die aktienquote reduziert um den kursrückgang multipliziert mit einem faktor, z.B. kurs: -3%–>
aktienquote: -3%*5=15%; also wird die aktienquote um 15% reduziert.
gleichzeitig muss der teil der festverzinsl. wertpapiere erhöht werden, ebenfalls um 15%. denn es sollen ja 100% des vermögens investiert werden, nur die aufteilung zwischen aktien und festverz. wertpapieren soll sich ändern.
bei steigenden kursen soll nix verändert werden.
meine aktienquote kann darf in diesem fall nicht negativ werden, daher
if