2017-02-08 11 views
2

Ich möchte die wöchentlichen Renditen eines Investmentfonds aus einer Zeitreihe von Tagespreisen berechnen. Meine Daten sieht wie folgt aus:Wöchentliche Erträge aus täglichen Zeitreihen berechnen

A  B  C  D  E 
DATE  WEEK W.DAY MF.PRICE WEEKLY RETURN 
02/01/12 1 1  2,7587 
03/01/12 1 2  2,7667 
04/01/12 1 3  2,7892 
05/01/12 1 4  2,7666 
06/01/12 1 5  2,7391 -0,007 
09/01/12 2 1  2,7288 
10/01/12 2 2  2,6707 
11/01/12 2 3  2,7044 
12/01/12 2 4  2,7183 
13/01/12 2 5  2,7619 0,012 
16/01/12 3 1  2,7470 
17/01/12 3 2  2,7878 
18/01/12 3 3  2,8156 
19/01/12 3 4  2,8310 
20/01/12 3 5  2,8760 0,047 

Das Datum ist (TT/MM/JJ) Format und "" ist Dezimaltrennzeichens. Dies wird mit folgender Formel durchgeführt: (Preis für den letzten Werktag - Preis für den ersten Werktag)/(Preis für den ersten Werktag). Zum Beispiel ist die Rendite für die erste Woche (2,7391 - 2,7587)/2,7587 = -0,007 und für die zweite (2,7619 - 2,7288)/2,7288 = 0,012.

Das Problem ist, dass die Liste für ein Jahr läuft, und einige Wochen haben weniger als fünf Arbeitstage aufgrund von Urlaub oder anderen Gründen. Daher kann ich die obige Formel nicht einfach kopieren und einfügen. Ich fügte die zusätzlichen zwei Spalten für die Wochennummer und den Wochentag mit den Funktionen WEEKNUM und WEEKDAY hinzu und dachte, es könnte helfen. Ich möchte, dies automatisieren mit einer Formel oder mit VBA und der Hoffnung auf eine Tabelle wie folgt zu erhalten:

WEEK RETURN 
1  -0,007 
2  0,012 
3  0,047 
.  
.  
.  

Wie ich sagte, einige Wochen weniger als fünf Wochentagen, einige beginnen mit Wochentag 2 oder enden mit Wochentag 3 usw. aufgrund von Urlaub oder anderen Gründen. Also denke ich an einen Weg, Excel zu sagen, "die Preise zu finden, die dem maximalen und minimalen Wochentag jeder Woche entsprechen und die Formel anwenden (Preis für den letzten Werktag - Preis für den ersten Werktag)/(Preis für den ersten Werktag)" .

Sorry für die lange Post, ich versuchte, so klar wie möglich zu sein, würde ich jede Hilfe zu schätzen wissen! (Ich habe 5 separate Arbeitsblätter für aufeinander folgende Jahre, jeweils mit Tagespreisen von 20 Investmentfonds)

Antwort

2

es in einer Formel zu tun:

=(INDEX(D:D,AGGREGATE(15,6,ROW($D$2:$D$16)/(($C$2:$C$16=AGGREGATE(14,6,$C$2:$C$16/($B$2:$B$16=G2),1))*($B$2:$B$16=G2)),1))-INDEX(D:D,MATCH(G2,B:B,0)))/INDEX(D:D,MATCH(G2,B:B,0)) 

Sie müssen möglicherweise alle ändern , zu ; für Ihre lokalen Einstellungen.

enter image description here

+0

Danke @Scott Craner, du hast mir viel Zeit gespart. Ich würde mich freuen, wenn Sie die Bearbeitung meiner Frage überprüfen könnten. – orkanoid

+0

Ändern Sie die Frage nicht, nachdem Sie eine Antwort erhalten haben. Erstelle eine neue Frage. Es öffnet die aktuellen Antworten für Down-Stimmen. @orkanoid –

+0

Oh Entschuldigung, wusste das nicht. Soll ich die Bearbeitung löschen und eine neue Frage erstellen oder ist es zu spät? – orkanoid

1

Ich würde es lösen mit einigen Nachschlagen Formeln, um die Werte für jede Woche zu erhalten und dann eine einfache Berechnung für jede Woche tun.

resultierende Tabelle:

H I   J   K   L   M  
    first  last  first val last val return 
1 02.01.2012 06.01.2012 2,7587  2,7391  -0,007 
2 09.01.2012 13.01.2012 2,7288  2,7619  0,012 
3 16.01.2012 20.01.2012 2,747  2,876  0,047 

Formel in Spalte I:

=MINIFS($A:$A;$B:$B;$H2) 

Fomula in Spalte J:

=MAXIFS($A:$A;$B:$B;$H2) 

Formel in Spalte K:

=VLOOKUP($I2;$A:$D;4;FALSE) 

Formel in Spalte L:

=VLOOKUP($J2;$A:$D;4;FALSE) 

Formel in Spalte M:

=(L2-K2)/K2 
+0

FWIW: MINIFS und MAXIFS sind auf Office 365 Excel verfügbar. Wenn nicht, müssen Sie AGGREGATE oder einen ARRAY MAX (IF()) verwenden. Da keine Arrayformeln verwendet werden, können Sie auch vollständige Spaltenreferenzen verwenden. Eine letzte Notiz. Ersetzen Sie das "WRONG" im vierten Kriterium des SVERWEIS mit "FALSE". –

+0

@ScottCraner thx für die Klärung. Entschuldigung für das "FALSCH", es rutschte in während der Übersetzung ins Englische. – pintxo

+0

Ich denke, ich kann die MINIFS-Funktion nicht verwenden. Hältst du mir einen #NAME? Error. Wie sollte ich die Funktionen AGGREGATE und ARRAY MAX (IF()) @ScottCraner verwenden? – orkanoid

Verwandte Themen