Finanzmathematik

In der Finanzmathematik braucht man häufig Methoden die bestimmte Trends oder Gruppierungen in Listen von Aktienkursen vornehmen. Im folgenden einige Beispielfunktionen die dieses tun:

Ermittle Länge einer reiner Profit- oder Verlustreihe

Quellcode:

   1 def tell_lst_length(lst):
   2     lst_length = 0
   3 
   4     for i in lst:
   5         if i > 0:
   6             lst_length += 1
   7         elif i < 0:
   8             lst_length -= 1
   9         elif i == 0:
  10             lst_length = 0
  11 
  12     return lst_length

input:

output:

Beispiel

   1 >>> tell_lst_length([1, 1, 1, 1, 2])
   2 5

Profit- und Verlustreihen

Quellcode:

   1 def sort_lst_by_profit_or_loss(lst, last_balance):
   2     if len(lst) == 1:
   3         lst.append(0)
   4     lst.insert(0, last_balance)
   5 
   6     if (lst[0] > 0) and (lst[1] <= 0):
   7         lst = [ lst[0] ]
   8     elif (lst[0] < 0) and (lst[1] >= 0):
   9         lst = [ lst[0] ]
  10     elif (lst[0] == 0):
  11         lst = [ lst[0] ]
  12 
  13     return lst

input:

output:

Beispiel: Um erfolgreich zu sein im Markt ist es meines Erachtens notwendig, dass man konstant Profit macht. Seien es nun Jahre, Monate, Wochen oder gar Tage. Wenn zum Beispiel ein Unternehmen 5 Jahre hintereinander Profit gemacht hat und nun auf einmal ein negatives Jahr anfängt, dann wurde die einstige Erfolgsserie gebrochen. Wenn nun das nächste Jahr trotz aller Maßnahmen Verlust bringt, dann hat das Unternehmen konstant Verlust gemacht, eine Niederlagsserie.

Die Funktion hat zur Aufgabe positive Integer miteinander zu verknüpfen. Sollte ein negativer Wert oder Null auftreten, wird die gesamte Liste auf diesen letzten Trendumbruch zurückgestutzt. Natürlich sollen auch alle negativen Integer miteinander verknüpft werden. Dann wird der Trend gebrochen, falls ein positiver Wert oder Null auftritt.

   1 >>> row = [1, 1, 1]
   2 # Unternehmen mit regelmäßigem Gewinn pro Jahr
   3 >>> for i in range(1, 10):
   4         row = sort_lst_by_profit_or_loss(row, i)
   5 >>> row
   6 [9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1]
   7 # Das Unternehmen weist einen konstanten Erfolg auf
   8 
   9 >>> row = sort_lst_by_profit_or_loss(row, -5)
  10 # Das erste Verlustjahr
  11 >>> row
  12 [-5]

Aktienkurse nach Trends verbinden

Quellcode:

   1 def make_trends(lst):
   2     rv = []
   3     for i in lst:
   4         if not rv or dir ^ (i>=0):
   5             rv.append(i)
   6             dir = i>=0
   7         else:
   8             rv[-1] += i
   9     return rv
  10 
  11 # Geht nur mit 2.4
  12 import itertools
  13 def make_trends_24(lst):
  14     return [sum(l) for _, l in itertools.groupby(lst,lambda k:k>=0)]

Beispiel: Man schaut sich die Preisbewegung an. Egal von was. Was fällt auf? Der Preis steigt zB um den Wert 1, verharrt ein paar Sekunden an dieser Stelle, steigt erneut um den Wert 1 und sofort darauf um den Wert 4. Dann fällt er das erste mal. -1. Er fällt weiter, diesmal -3. Man hat also eine Abfolge von Preisbewegungen die durch zeitliche Einheiten voneinander getrennt sind. Man kann jetzt zB mehrere aufeinander folgende Aufwärtsbewegungen zu einer einzigsten Aufwärtsbewegung zusammenfassen.

   1 >>> make_trends([1,2,3,4,-1,-2,3,-4,-5,6])
   2 [10, -3, 3, -9, 6]
   3 >>>
   4 # In diesem Beispiel würde der Preis nun also erst 4x hintereinander steigen. 
   5 # Diese kleinen Bewegungen werden zu einer großen zusammengefasst. Und so wird weiterverfahren mit den nachfolgenden.
   6 

Kurse verbinden / Aggregate bilden

Quellcode:

   1 def connect_elements(lst, n):
   2     return [sum(lst[i:i+n]) for i in range(0, len(lst), n)]

Beispiel: Man hat jetzt die kleinen Schwankungen des Preises zusammengefasst zu höheren Trends. Man hat jetzt also eine Liste von [10, -3, 3, -9, 6], die besagt, dass ein Aufwärtstrend um 10, ein Abwrätstrend um -3 und so weiter, dass diese Trends stattgefunden haben. Wenn man nun die Trends wieder erneut zusammenfasst, erhält man noch gröbere Einheiten. Im Endeffekt zoomt man noch weiter heraus und ist dadurch in der Lage mehr zu sehen.

   1 >>> connect_elements([10, -3, 3, -9, 6], 2)
   2 [7, -6, 6]
   3 
   4 >>> connect_elements([10, -3, 3, -9, 6], 3)
   5 [10, -3]
   6 >>>

Kurse aus einer Liste filtern

Quellcode:

   1 def filter_lst(lst, n):
   2     return [x for x in lst if x not in n]

Beispiel: Man hat jetzt alle Trends einer Woche berechnet: [10, -3, 3, -9, 6]. Montag eine Gesamtschwankung um 10, Dienstag um -3 und so weiter. Nun kommt das Wochenende. Der Markt ruht. Die Liste erweitert sich und sieht so aus:

Wenn man nun diese Daten als nicht relevant ansieht, besteht nun die Möglichkeit sie einfach herauszufiltern.

   1 >>> filter_lst([10, -3, 3, -9, 6, 0, 0], [0])
   2 [10, -3, 3, -9, 6]
   3 # Wochenend-Daten herausgefiltert
   4 
   5 >>> filter_lst([10, -3, 3, -9, 6, 0, 0], [0, 10])
   6 [-3, 3, -9, 6]

Finanzmathematik (last edited 2009-06-17 16:14:17 by localhost)