Werte aus 4 For-Schleifen abspeichern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
winter01
User
Beiträge: 2
Registriert: Montag 14. November 2022, 22:49

Guten Abend,

ich habe einen Algorithmus zur Bepreisung von Optionen geschrieben und stoße auf ein Problem bzgl. meiner For-Schleifen. Da ich (s.u.) 4 For-Schleifen hintereinander ausführe, hängt der Wert v_neu(l1,l2,l3,l4) jeweils von 4 Parametern ab. Damit mein Algorithmus durchläuft muss ich v_neu(l1,l2,l3,l4) vorher definieren. Allerdings kann ich nicht wie gewohnt v_neu als Matrix setzen und die Werte v_neu(l1,l2,l3,l4) als Matrizeneinträge abspeichern, da v_neu ja jeweils von 4 Parametern abhängt. Hat jemand von euch eine Idee worin ich die Werte stattdessen abspeichern kann, damit mein Algorithmus funktioniert? Vielen Dank schonmal im vorraus! :)

#Rekursionsschritt
def v_final():
for n in range (1,N):
for l1 in range (0,N-n):
for l2 in range (0,N-(n-l1)):
for l3 in range (0,N-(n-l1-l2)):

l4 = N-(n-l1-l2-l3)

v_neu(l1,l2,l3,l4) == v_alt(l1+1,l2,l3,l4)*p11 + v_alt(l1,l2+1,l3,l4)*p10 + v_alt(l1,l2,l3+1,l4)*p01 + v_alt(l1,l2,l3,l4+1)*p00

v_alt(l1,l2,l3,l4) == v_neu(l1,l2,l3,l4)

return v_neu(l1,l2,l3,l4)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles was eine Funkktion braucht, muß sie auch über ihre Argumente bekommen. p11, p10, p01 und p00 kommen aber aus dem Nichts.
Du schreibst von einer Matrix v_neu, ich sehe aber nur eine Funktion v_neu. Mit dem Ergebnis der Vergleiche zwischen den Funktionsaufrufen v_neu(...) und v_alt(...) machst Du nichts, die ganzen for-Schleifen sind also überflüssig.
Wenn v_neu und v_alt wirklich Matrizen wären, müßten sie ja genauso Argumente von v_final sein. Diese v-Präfixe sind sehr verwirrend. Gute Variablennamen helfen beim Verständnis.
Du schreibst etwas von Rekursion, v_final wird aber gar nicht wieder aufgerufen?
Du schreibst von Matrix, wenn das also numpy-Arrays sind, dann sind die ganzen for-Schleifen ein Zeichen dafür, dass Du numpy nicht richtig verwendest.
Wenn ich das recht sehe, ist das ungefähr das selbe wie:

Code: Alles auswählen

neu = alt[1:,:-1,:-1,:-1] * p11 + alt[-1,1:,:-1,:-1] * p10 + alt[:-1,:-1,1:,:-1] * p01 + alt[:-1,:-1,:-1,1:] * p00
winter01
User
Beiträge: 2
Registriert: Montag 14. November 2022, 22:49

Hey! Vielen Dank für deine schnelle Antwort! Ich nutze die for-Schleifen weil die pro Durchlauf berechneten Werte für den nächsten Durchlauf gebraucht werden. Ich habe mein Skript auf deine Hinweise hin noch einmal überarbeitet (s.u.). Allerdings verstehe ich nicht wieso meine for-Schleifen überflüssig sind?

Mein Problem ist jetzt allerdings immer noch, dass das v_alt nicht erkannt wird. Ich muss also das v_alt vorher definieren und an der Stelle scheitert es... Hat jemand eine Idee wie ich das v_alt, v_neu definieren kann, damit die Werte zwischen gespeichert werden können?

def v(r,s0_1,u2,d2,s0_2,e11,e10,e01,e00,p11,p10,p01,p00):

v_alt =
v_neu =

#Initialisierung
for l1 in range (0,N): #Summe die zählt, wie oft beide Aktie aufwärts springen
for l2 in range (0,N-l1): #Summe die zählt, wie oft Aktie 1 aufwärts und Aktie 2 abwärts springt
for l3 in range (0,N-l1-l2): #Summe die zählt, wie oft Aktie 1 abwärts und Aktie 2 aufwärts springt

v_alt[l1,l2,l3] = (1+r)**N*g(s0_1*u2**(l1+l3)*d2**(1-(l1+l3)), s0_2*e11**l1*e10**l2*e01**l3*e00**(N-l1-l2-l3))
return v_alt

#Rekursionsschritt
for n in range (1,N):
for l1 in range (0,N-n):
for l2 in range (0,N-(n-l1)):
for l3 in range (0,N-(n-l1-l2)):

v_neu[l1,l2,l3] = v_alt[l1+1,l2,l3]*p11 + v_alt[l1,l2+1,l3]*p10 + v_alt[l1,l2,l3+1]*p01 + v_alt[l1,l2,l3]*p00

v_alt[l1,l2,l3] = v_neu[l1,l2,l3]

return v_neu[1,1,1]

Preis = v(r,s0_1,u2,d2,s0_2,e11,e10,e01,e00,p11,p10,p01,p00)
print(Preis)
Antworten