Anzeige
Archiv - Navigation
1004to1008
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Wechselnde Werte in VBA
Oliver
Hallo VBAler,
ich habe folgendes Problem, ich möchte gern eine Strategie an Hand von Hoch und Tiefpunkten testen, dies hat bisher einwandfrei funktioniert ... nun soll aber zwischen jedem ermitteltem Hoch zu einem Tief 3 Monate liegen - von Tief zu hoch besteht weiter mindesthaltedauer 1 Monat, also 1 Zeile (einfach) (habe also nur zwei Spalten zu betrachten, Datum und Renditezeitreihe)
Habe als ersten einfachen Ansatz die Bedingung dahingehend erweitert, dass ein Tief nur bei
Cells (-1, 1) "Hoch" And Cells(-2,1) "Hoch" erscheint - geht, außerdem erscheint "Hoch" nur, wenn Tief=1 ... also tief auf 1 gesetzt wurde ... unten mal der Code (kann die Datei leider nicht anhängen)
hier der VBA Auszug
If IsEmpty(Cells(intZeile + 1, Spalte_Anlagemarkt)) = False Then
If Cells(intZeile, Spalte_Anlagemarkt) > Cells(intZeile - 1, Spalte_Anlagemarkt) And
Cells(intZeile, Spalte_Anlagemarkt) > Cells(intZeile + 1, Spalte_Anlagemarkt) And Tief = 1
Then
Hoch = 1
Cells(intZeile, Spalte_Aktion) = "Hoch"
Else
Hoch = 0
End If
If Cells(intZeile, Spalte_Anlagemarkt) Spalte_Anlagemarkt) Cells(intZeile - 1, Spalte_Aktion) "Hoch" And Cells(intZeile - 2, Spalte_Aktion) "Hoch"
Then
Tief = 1
Cells(intZeile, Spalte_Aktion) = "Tief"
Else
Tief = 0
End If

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Wechselnde Werte in VBA
01.09.2008 14:39:15
fcs
Hallo Oliver,
so ganz hab ich die Reihenfolge Hoch/Tief nicht verstanden.
Mein Verständnis:
Wenn die Rendite zum Vormonat ansteigt, dann "Hoch" eintragen, wenn die Rendite 3 mal in Folge niedriger ist, dann "Tief" eintragen.
Dann funktioniert das nachfolgende Makro, das du an deine Daten anpassen muss.
Gruß
Franz

Sub test()
Spalte_Anlagemarkt = 2
Spalte_Aktion = 3
startzeile = 2 'Zeile mit 1. Datensatz
With ActiveSheet
endzeile = .Cells(.Rows.Count, Spalte_Anlagemarkt).End(xlUp).Row
End With
tief = 0
For intZeile = startzeile + 1 To endzeile
Cells(intZeile, Spalte_Aktion).ClearContents
If IsEmpty(Cells(intZeile, Spalte_Anlagemarkt)) = False Then
If Cells(intZeile, Spalte_Anlagemarkt) > Cells(intZeile - 1, Spalte_Anlagemarkt) Then
tief = 0
Cells(intZeile, Spalte_Aktion) = "Hoch"
Else
tief = tief + 1
If tief >= 3 Then
Cells(intZeile, Spalte_Aktion) = "Tief"
End If
End If
End If
Next
End Sub


Anzeige
AW: Wechselnde Werte in VBA
Oliver
Hallo, danke erstmal Franz, aber ich habe es noch nicht ganz richtig erklärt.
Gegeben:
-in Spalte 1 das jeweilige Monatsultimo (31.01.2005 - 31.07.2008)
-in Spalte 2 die Renditen am Markt für Anleihen (oder aktuelle Marktzinsen), Spalte_Anlagemarkt
(-Spalte 3 Rendite am Geldmarkt - EURIBOR, falls dir das etwas sagt)
-Spalte 4, hier steht "Hoch" oder "Tief", Spalte_Aktion
Welche zahlen da nun genau stehen, ist ja nicht so entscheidend. Aus 3 Zinspunkten (Spalte 2) kannst du ja nun ein "Hoch", "Tief" oder eben nichts bestimmen.
Kurzes Beispiel: "Hoch" = Kurs -1 Kurs +1 ... et vice versa für "Tief"3
Für mich ist ein "Hoch" ein Kaufsignal und ein "Tief" ein Verkaufssignal (nicht verwirren lassen, sind in dem Fall keine Aktien). Die Problematik die ich noch nicht überwinden kann liegt nun darin, dass ein "Hoch", also die Position im Wertpapier mind. 3 Monate gehalten werden muss. Also muss der Abstand von einem "Hoch"punkt zum "Tief" 3 Monate oder 2 leere Zeilen betragen. Naürlich kann ich bei "tief" und Verkauf meines Wertpapieres sofort wieder kaufen einen Monat später, also kann "Hoch" sofort auf "Tief" folgen.
Ist das verständlich, sorry, sicherlich verwirrend, aber Danke für die Mühe, dass ihr drüber nachdenkt, hier nochmal ein längerer Codeteil, wie er ursprünglich ist, ohne diese 3 Monatsregel (variabel wäre das natürlich auch nicht schlecht, aber fix 3 Monate ist für mich entscheidend):
VIELEN DANK und sorry, kann hier leider nicht dieses Darstellungstool für VBA Codes installieren.
hier das ganze (Anlagemarkt und Geldmarkt sind extra functions):

Sub BestStrategy()
Dim intZeile As Integer
Dim ZeilenStart As Integer
Dim AnzahlDatenzeilen As Integer
Dim Datum_Start_H As Date
Dim Datum_Ende_H As Date
Dim Datum_Diff_H As Integer
Dim Datum_Start_G As Date
Dim Datum_Ende_G As Date
Dim Datum_Start_F As Date
Dim Datum_Ende_F As Date
Static Hoch As Integer
Static Tief As Integer
Dim Datum_Differenz As Integer
Static Depot As Double
Dim Marktzins_G As Double
Dim Marktzins_F As Double
Dim Marktzins_z As Double
Dim Kupon As Double
Dim Spalte_Datum As Integer
Dim Spalte_Geldmarkt As Integer
Dim Spalte_Anlagemarkt As Integer
Dim Spalte_Aktion As Integer
Dim Spalte_Haltedauer As Integer
Dim Spalte_Depot As Integer
Dim Spalte_Kupons As Integer
Dim Spalte_Performance As Integer
Dim Spalte_Zeitraum As Integer
Dim Kuponzahlung As Double
Dim cnt As Integer
Dim Differenz As Integer
Dim i As Integer
Dim Kupon_z As Double
Dim Kupon_k As Double
Dim TageseitletzterKupon As Double
Dim Kupon_Neuanlage As Double
Dim Depot_Neuanlage As Double
Dim Datum_Differenz_Neuanlage As Integer
Dim Datum_Start_Neuanlage As Date
Dim Marktzins_Neuanlage As Double
Spalte_Datum = 1
Spalte_Anlagemarkt = 2
Spalte_Geldmarkt = 3
Spalte_Aktion = 4
Spalte_Haltedauer = 5
Spalte_Depot = 6
Spalte_Kupons = 7
Spalte_Performance = 8
Spalte_Zeitraum = 9
ZeilenStart = 2
AnzahlDatenzeilen = 32767
Range("D1:I1").EntireColumn.Value = ""
Cells(1, Spalte_Aktion) = "Aktion"
Cells(1, Spalte_Haltedauer) = "Haltedauer (d)"
Cells(1, Spalte_Depot) = "Depot Best"
Cells(1, Spalte_Kupons) = "Kupons"
Cells(1, Spalte_Performance) = "Performance (%)"
Cells(1, Spalte_Zeitraum) = "Zeitraum (y)"
For intZeile = ZeilenStart To AnzahlDatenzeilen
If intZeile = ZeilenStart Then
Depot = 100
Datum_Start_H = 0
End If
If IsEmpty(Cells(intZeile, Spalte_Anlagemarkt)) Then
Datum_Ende_H = Cells(intZeile - 1, Spalte_Datum)
Datum_Diff_H = DateDiff("d", Datum_Start_H, Datum_Ende_H)
Cells(2, Spalte_Performance) = (Depot - 100)
Cells(2, Spalte_Zeitraum) = Datum_Diff_H / 365
Sheets("Auswertung").Cells(4, 5) = Sheets("Daten").Cells(2, Spalte_Performance)
Sheets("Auswertung").Cells(4, 6) = Sheets("Daten").Cells(2, Spalte_Zeitraum)
Sheets("Auswertung").Cells(4, 7) = (((Depot) / 100) ^ (1 / (Datum_Diff_H / 365)) -  _
1) * 100 'jährliche Rendite
Exit For
End If
If IsEmpty(Cells(intZeile + 1, Spalte_Anlagemarkt)) Then
If Hoch = 1 Then
Tief = 1
Hoch = 0
Else
Tief = 0
Hoch = 1
End If
End If
If IsEmpty(Cells(intZeile + 1, Spalte_Anlagemarkt)) = False Then
If Cells(intZeile, Spalte_Anlagemarkt) > Cells(intZeile - 1, Spalte_Anlagemarkt)  _
And Cells(intZeile, Spalte_Anlagemarkt) > Cells(intZeile + 1, Spalte_Anlagemarkt) Then
Hoch = 1
Cells(intZeile, Spalte_Aktion) = "Hoch"
Else
Hoch = 0
End If
If Cells(intZeile, Spalte_Anlagemarkt)  Cells(intZeile - 1, Spalte_Anlagemarkt)  _
And Cells(intZeile,
Spalte_Anlagemarkt) = Cells(intZeile + 1, Spalte_Anlagemarkt) Then
Do Until Cells(intZeile + 1, Spalte_Anlagemarkt)  Cells(intZeile,  _
Spalte_Anlagemarkt)
intZeile = intZeile + 1
Loop
If Cells(intZeile + 1, Spalte_Anlagemarkt)  Cells(intZeile - 1,  _
Spalte_Anlagemarkt) And Cells
(intZeile, Spalte_Anlagemarkt) = Cells(intZeile + 1, Spalte_Anlagemarkt)
intZeile = intZeile - 1
Loop
Hoch = 1
Cells(intZeile, Spalte_Aktion) = "Hoch"
End If
End If
End If
If Cells(intZeile, Spalte_Anlagemarkt)  Cells(intZeile,  _
Spalte_Anlagemarkt)
intZeile = intZeile + 1
Loop
If Cells(intZeile + 1, Spalte_Anlagemarkt) > Cells(intZeile, Spalte_Anlagemarkt)  _
Then
Do Until Cells(intZeile, Spalte_Anlagemarkt)  ZeilenStart And Datum_Start_G > "00.01.1900" Then
Datum_Ende_G = Cells(intZeile, Spalte_Datum)
Cells(intZeile, Spalte_Haltedauer) = DateDiff("d", Datum_Start_G, Datum_Ende_G)
Datum_Differenz = DateDiff("d", Datum_Start_G, Datum_Ende_G)
Depot = Geldmarkt(Depot, Datum_Differenz, Marktzins_G)
Cells(intZeile, Spalte_Depot) = Depot
End If
If Hoch = 1 Then
Datum_Start_F = Cells(intZeile, Spalte_Datum)
Kupon = Cells(intZeile, Spalte_Anlagemarkt)
Kupon_z = Cells(intZeile, Spalte_Anlagemarkt)
cnt = intZeile
End If
If Tief = 1 And intZeile > ZeilenStart And Datum_Start_F > "00.01.1900" Then
Datum_Ende_F = Cells(intZeile, Spalte_Datum)
Cells(intZeile, Spalte_Haltedauer) = DateDiff("d", Datum_Start_F, Datum_Ende_F)
Datum_Differenz = DateDiff("d", Datum_Start_F, Datum_Ende_F)
Kuponzahlung = WorksheetFunction.RoundDown(Datum_Differenz / 365, 0)
TageseitletzterKupon = Datum_Differenz - Kuponzahlung * 365
Marktzins_F = Cells(intZeile, Spalte_Anlagemarkt)
If Kuponzahlung > 0 Then
For i = 1 To Kuponzahlung
Do Until (Differenz >= i * 365 - 1) And (Differenz 


Anzeige
AW: Wechselnde Werte in VBA
Oliver
muss kurz zu meinem Beitrag von eben anmerken, dass ich im Beispiel der Bestimmung eines "Hoch" nicht Kurs meine, Kurs gibt es ja so gar nicht, sondern marktzins bzw. Marktrendite für Anleihen (also Spalte 2)
Tief= Rendite Vormonat > Rendite diesen Monat Hoch= Rendite Vormonat Rendite nächster Monat
Danke
AW: Wechselnde Werte in VBA
01.09.2008 18:02:00
fcs
Hallo Oliver,
ich hab jetzt nicht die Zeit deinen Code mit zum Teil finanztechchnischen Besonderheiten zu verdauen.
Meiner Meinung nach müsstest du jetzt wie folgt vorgehen:
Du vergleichst in der Schleife die Werte zwischen aktuellem, vorherigen und nachfolgendem Wert.
Wenn der Indikator "Hoch" ergibt, dann speicherst du den Wert in einer Variablen zwischen und setzt einen Zähler auf 3.
In den weiteren Schleifendurchlaufen wird der Zähler jeweils um 1 reduziert und die Auswertung auf "Tief" / "Hoch" übersprungen bis der Zähler einen Wert <=1 hat.
Was ich jetzt nicht weiss ist, ob du für die weiteren Hoch/Tief Auswertungsvergleiche den Wert vom letzten "Hoch" verwenden muss/willst oder immer mit den 3 in der Tabelle eingetragen Werten die Tief/Hoch-Bestimmung abarbeiten willst.
Entsprechend kompliziert wird dann ggf. das Setzten/Zurücksetzen des Vergleichswertes.
Gruß
Franz
Anzeige
AW: Wechselnde Werte in VBA
05.09.2008 11:16:00
Oliver
Danke Franz,
ich hatte noch keine Zeit es weiter zu testen, werde am Wochenende mal deinen Vorschlag umsetzen, allerdings grenzt du etwas ein, was, wenn ich dich richtig verstehe ;-) schon bedacht werden muss. Zwar verwendet der Code immer nur 3 Daten für die Bestimmung von "Hoch" oder "Tief" (vielleicht hast du im Code allerdings gesehen, dass die Punkte auch noch anders bestimmt werden mit mehr als 3 Datenpunkten - Täler, Plateaus genannt) und die ändern sich ja immer, aber für die weiteren internen finanz. Berechnungen brauche ich die entsprechenden Ultimo und Zinssätze der letzten Hochs und Tiefs noch, falls du dies meinst.
Ich weiß, dass durch die finanztheoretischen Gedankengänge (welche ja hier sehr grundlegend nur sind) man schwierig jemand verdeutlichen kann, was man eigentlich will (zumal über das Forum). Aber eben erst an diesem Punlkt wird es interessant, nämlich beim Einsatz der Programmierung zur Lösung prakt. Probleme.
du kannst dich gerne nochmal melden, ciao
Anzeige

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige