Seite 1 von 1
Rollierende returns aus Dataframe
Verfasst: Fr Apr 09, 2021 12:38 pm
von Lili94
Hallo liebes Forum,
ich benötige erneut Hilfe. Es tut mir super Leid, aber ich bin noch Anfängerin.....
Ich habe jetzt aus einem Datensatz mit Preisen bereits Renditen oder returns gebildet. Für meinen Datensatz (1128 Monate und 34390 verschiedene Werte, viele NAs dabei) möchte ich jetzt für Zeitpunkt t einen Dreimonatsreturn bilden. Damit ergeben sich für die ersten beiden Monate NA´s. Ab dem dritten Monat soll dann der erste Dreimonatsreturn gebildet werden (Monat1,Monat2,Monat3) für Monat 4 der zweite Dreimonatsreturn (Monat2, Monat3, Monat4).
Mein Ansatz ist über eine for-Schleife:
Code: Alles auswählen
for (i in 1:1126){
datanew[(i+2),]<-sapply(as.data.frame(t(data+1))[(i):(i+2)],prod)-1
}
leider dauert dies ewig, also vermute ich, dass der Ansatz schon nicht ganz richtig ist. Kann mir jemand helfen? Dankeschöööön schonmal
LG Lili
Re: Rollierende returns aus Dataframe
Verfasst: Fr Apr 09, 2021 12:47 pm
von EDi
Bitte ein reproduzierbares Beispiel posten.
Re: Rollierende returns aus Dataframe
Verfasst: Fr Apr 09, 2021 1:29 pm
von Lili94
Hallo EDI,
1 2 3 4 5 6 7 8 9
738 -0.02 NA NA NA NA NA NA NA NA
739 -0.10 NA NA NA NA NA NA NA NA
740 -0.34 NA NA NA NA NA NA NA -0.06
741 0.14 0.12 NA NA NA NA NA -0.12 0.00
742 0.18 0.21 NA NA NA NA NA -0.08 -0.15
743 -0.03 0.00 -0.05 NA -0.06 0.16 NA 0.21 0.00
744 0.00 -0.17 0.11 -0.08 0.10 0.16 NA -0.10 NA
745 -0.11 0.00 0.00 0.20 0.02 0.22 -0.19 0.03 NA
746 0.06 0.10 0.03 -0.04 0.11 -0.03 -0.17 -0.16 NA
747 -0.06 -0.02 0.03 -0.01 -0.10 0.05 0.13 0.12 NA
748 -0.03 0.00 0.14 0.12 0.06 0.03 -0.11 0.00 NA
749 -0.30 -0.08 0.04 0.07 0.07 0.01 -0.38 -0.33 NA
750 -0.13 0.00 -0.06 0.01 -0.02 0.04 -0.17 0.58 NA
751 -0.40 -0.04 0.28 0.11 -0.12 0.14 0.05 -0.05 NA
752 NA -0.04 -0.05 0.03 -0.17 0.06 0.00 0.08 NA
753 NA -0.36 0.03 -0.12 -0.09 -0.08 -0.14 -0.13 NA
754 NA 0.43 0.05 -0.05 -0.03 -0.07 -0.61 0.06 NA
755 NA 0.00 0.05 -0.02 0.13 0.05 -0.29 -0.14 NA
756 NA -0.35 0.03 -0.13 -0.09 -0.12 0.00 -0.16 NA
757 NA 0.19 -0.19 0.06 -0.12 -0.03 NA 0.00 NA
758 NA 0.35 0.14 -0.07 0.17 -0.25 NA 0.04 NA
759 NA 0.14 0.00 -0.03 0.15 0.05 NA -0.07 NA
760 NA -0.21 0.03 -0.07 NA -0.02 NA -0.12 NA
761 NA -0.29 0.06 -0.07 NA -0.03 NA -0.09 NA
762 NA 0.19 -0.09 -0.05 NA 0.08 NA -0.45 NA
763 NA -0.09 -0.23 0.10 NA -0.14 NA -0.36 NA
764 NA -0.41 -0.34 -0.15 NA 0.16 NA 0.14 NA
765 NA -0.41 0.00 -0.20 NA 0.01 NA 0.12 NA
766 NA -0.05 0.09 -0.03 NA 0.11 NA 0.00 NA
767 NA 0.05 -0.14 0.53 NA 0.13 NA -0.22 NA
768 NA -0.50 -0.04 -0.02 NA -0.06 NA 0.43 NA
769 NA 1.80 0.46 0.13 NA 0.03 NA -0.20 NA
770 NA -0.07 -0.10 0.12 NA 0.15 NA 0.00 NA
771 NA 0.38 0.21 0.06 NA 0.06 NA 0.00 NA
772 NA 0.17 -0.11 -0.01 NA -0.09 NA 0.12 NA
773 NA 0.19 -0.02 -0.01 NA -0.01 NA 0.11 NA
774 NA 0.04 -0.12 0.13 NA 0.12 NA 0.30 NA
775 NA -0.12 0.00 0.15 NA 0.06 NA NA NA
776 NA -0.57 0.17 -0.02 NA -0.06 NA NA NA
777 NA 0.40 0.09 0.10 NA -0.04 NA NA NA
778 NA -0.36 -0.01 -0.03 NA 0.04 NA NA NA
779 NA 0.00 NA -0.04 NA 0.02 NA NA NA
780 NA 0.11 NA 0.17 NA 0.12 NA NA NA
781 NA 0.00 NA 0.13 NA 0.01 NA NA NA
782 NA -0.05 NA 0.25 NA 0.02 NA NA NA
783 NA 0.00 NA -0.04 NA -0.04 NA NA NA
784 NA 0.11 NA 0.07 NA -0.04 NA NA NA
785 NA -0.14 NA 0.00 NA 0.06 NA NA NA
786 NA -0.33 NA -0.04 NA 0.08 NA NA NA
787 NA 0.08 NA 0.17 NA 0.02 NA NA NA
788 NA -0.31 NA 0.08 NA -0.06 NA NA NA
789 NA -0.22 NA 0.08 NA -0.02 NA NA NA
790 NA -0.07 NA -0.01 NA 0.04 NA NA NA
791 NA -0.08 NA 0.00 NA 0.04 NA NA NA
792 NA 0.08 NA 0.08 NA -0.01 NA NA NA
793 NA -0.12 NA 0.20 NA 0.22 NA NA NA
794 NA -0.13 NA -0.01 NA -0.01 NA NA NA
795 NA -0.30 NA 0.05 NA 0.05 NA NA NA
796 NA 0.00 NA -0.06 NA -0.09 NA NA NA
797 NA 0.43 NA 0.01 NA -0.06 NA NA NA
798 NA 0.20 NA 0.12 NA 0.01 NA NA NA
799 NA -0.38 NA 0.21 NA 0.00 NA NA NA
800 NA NA NA 0.00 NA 0.01 NA NA NA
801 NA NA NA 0.03 NA -0.03 NA NA NA
802 NA NA NA 0.02 NA -0.02 NA NA NA
803 NA NA NA -0.04 NA 0.05 NA NA NA
804 NA NA NA -0.01 NA 0.16 NA NA NA
805 NA NA NA 0.01 NA -0.03 NA NA NA
806 NA NA NA 0.03 NA 0.07 NA NA NA
807 NA NA NA -0.02 NA 0.01 NA NA NA
808 NA NA NA 0.02 NA 0.06 NA NA NA
809 NA NA NA 0.01 NA 0.00 NA NA NA
810 NA NA NA 0.28 NA 0.10 NA NA NA
811 NA NA NA 0.07 NA 0.01 NA NA NA
812 NA NA NA 0.06 NA -0.16 NA NA NA
813 NA NA NA 0.04 NA -0.07 NA NA NA
814 NA NA NA -0.02 NA -0.07 NA NA NA
815 NA NA NA -0.08 NA 0.06 NA NA NA
816 NA NA NA NA NA -0.13 NA NA NA
817 NA NA NA NA NA -0.16 NA NA NA
818 NA NA NA NA NA -0.06 NA NA NA
819 NA NA NA NA NA -0.04 NA NA NA
820 NA NA NA NA NA 0.01 NA NA NA
821 NA NA NA NA NA 0.01 NA NA NA
822 NA NA NA NA NA 0.01 NA NA NA
823 NA NA NA NA NA -0.02 NA NA NA
824 NA NA NA NA NA -0.03 NA NA NA
825 NA NA NA NA NA -0.01 NA NA NA
826 NA NA NA NA NA -0.33 NA NA NA
827 NA NA NA NA NA 0.05 NA NA NA
828 NA NA NA NA NA 0.15 NA NA NA
829 0.13 NA NA NA NA -0.05 NA NA NA
830 0.18 NA NA NA NA -0.06 NA NA NA
831 0.05 NA NA NA NA 0.02 NA NA NA
832 0.00 NA NA NA NA -0.06 NA NA NA
833 -0.07 NA NA NA NA 0.04 NA NA NA
834 -0.08 NA NA NA NA 0.04 NA NA NA
835 0.11 NA NA NA NA -0.05 NA NA NA
836 -0.08 NA NA NA NA 0.07 NA NA NA
837 -0.03 NA NA NA NA 0.03 NA NA NA
838 -0.11 NA NA NA NA 0.23 NA NA NA
839 -0.06 NA NA NA NA 0.00 NA NA NA
840 -0.13 NA NA NA NA 0.01 NA NA NA
841 0.08 NA NA NA NA -0.09 NA NA NA
842 0.04 NA NA NA NA -0.03 NA NA NA
843 0.00 NA NA NA NA -0.20 NA NA NA
844 0.00 NA NA NA NA -0.06 NA NA NA
845 0.00 NA NA NA NA 0.06 NA NA NA
846 -0.10 NA NA NA NA 0.12 NA NA NA
847 0.19 NA NA NA NA 0.11 NA NA NA
848 0.00 NA NA NA NA -0.03 NA NA NA
dies ist ein kurzes Beispiel wie die Daten aussehen. Hilft das schon? Die Zeilen repräsentieren die Monate und die Spalten die verschiedenen Werte
Re: Rollierende returns aus Dataframe
Verfasst: Fr Apr 09, 2021 2:03 pm
von bigben
Hallo Lilli,
nein, das ist kein reproduzierbares Beispiel, weil es so in R nicht lauffähig ist und weil eine Beschreibung fehlt, wie das richtige Ergebnis aussehen soll. Die Daten als reproduzierbares Beispiel angeben könnte z. B. so aussehen:
Code: Alles auswählen
bsp <- read.table(text = "738 -0.02 NA NA NA NA NA NA NA NA
739 -0.10 NA NA NA NA NA NA NA NA
740 -0.34 NA NA NA NA NA NA NA -0.06
741 0.14 0.12 NA NA NA NA NA -0.12 0.00
742 0.18 0.21 NA NA NA NA NA -0.08 -0.15
743 -0.03 0.00 -0.05 NA -0.06 0.16 NA 0.21 0.00
744 0.00 -0.17 0.11 -0.08 0.10 0.16 NA -0.10 NA
745 -0.11 0.00 0.00 0.20 0.02 0.22 -0.19 0.03 NA
746 0.06 0.10 0.03 -0.04 0.11 -0.03 -0.17 -0.16 NA
747 -0.06 -0.02 0.03 -0.01 -0.10 0.05 0.13 0.12 NA
748 -0.03 0.00 0.14 0.12 0.06 0.03 -0.11 0.00 NA
749 -0.30 -0.08 0.04 0.07 0.07 0.01 -0.38 -0.33 NA
750 -0.13 0.00 -0.06 0.01 -0.02 0.04 -0.17 0.58 NA
751 -0.40 -0.04 0.28 0.11 -0.12 0.14 0.05 -0.05 NA
752 NA -0.04 -0.05 0.03 -0.17 0.06 0.00 0.08 NA
753 NA -0.36 0.03 -0.12 -0.09 -0.08 -0.14 -0.13 NA
754 NA 0.43 0.05 -0.05 -0.03 -0.07 -0.61 0.06 NA
755 NA 0.00 0.05 -0.02 0.13 0.05 -0.29 -0.14 NA
756 NA -0.35 0.03 -0.13 -0.09 -0.12 0.00 -0.16 NA
757 NA 0.19 -0.19 0.06 -0.12 -0.03 NA 0.00 NA
758 NA 0.35 0.14 -0.07 0.17 -0.25 NA 0.04 NA
759 NA 0.14 0.00 -0.03 0.15 0.05 NA -0.07 NA
760 NA -0.21 0.03 -0.07 NA -0.02 NA -0.12 NA
761 NA -0.29 0.06 -0.07 NA -0.03 NA -0.09 NA
762 NA 0.19 -0.09 -0.05 NA 0.08 NA -0.45 NA
763 NA -0.09 -0.23 0.10 NA -0.14 NA -0.36 NA
764 NA -0.41 -0.34 -0.15 NA 0.16 NA 0.14 NA
765 NA -0.41 0.00 -0.20 NA 0.01 NA 0.12 NA
766 NA -0.05 0.09 -0.03 NA 0.11 NA 0.00 NA
767 NA 0.05 -0.14 0.53 NA 0.13 NA -0.22 NA
768 NA -0.50 -0.04 -0.02 NA -0.06 NA 0.43 NA
769 NA 1.80 0.46 0.13 NA 0.03 NA -0.20 NA
770 NA -0.07 -0.10 0.12 NA 0.15 NA 0.00 NA")[,-1]
Siehst Du, wie praktisch das ist, dass mit [code}-Tags markierter Code nicht über die volle Länge angezeigt wird?
Zur Nachmachung empfohlen!
Ich bin nicht sicher, ob ich verstehe, was Du mit returns meinst. Sicher für Kaufleute kein Problem, aber wir sind ja nicht alle Kaufleute.
Schau mal, ob ich das richtig verstanden habe und wenn ja, ob das so mit akzeptabler Geschwindigkeit läuft:
Code: Alles auswählen
threemonth <- numeric(nrow(bsp))
threemonth[1] <- NA
threemonth[2] <- NA
for(i in 3:nrow(bsp))
threemonth[i] <- sum(rowSums(bsp[(i-2):i,],na.rm = TRUE))
plot(threemonth, type = "l")
head(threemonth, 10)
bsp$threemonth <- threemonth
LG,
Bernhard
Re: Rollierende returns aus Dataframe
Verfasst: Fr Apr 09, 2021 3:26 pm
von schubbiaschwilli
Gude!
bigben hat geschrieben: Fr Apr 09, 2021 2:03 pmIch bin nicht sicher, ob ich verstehe, was Du mit returns meinst. Sicher für Kaufleute kein Problem, aber wir sind ja nicht alle Kaufleute.
Selbst für Kaufleute (ich bin ja selbst auch keiner) sollte das ein Problem sein - Was sind das für Returns: Stetige? Oder 'Normale'? Blöde Frage: Die Returns sind ja aus irgendwelchen Kurs/Preiszeitreihen gebildet worden: Warum greifst du nicht auf diese zurück, und berechnest aus diesen die Returns?
Dank&Gruß
Schubbiaschwillli
Nachtrag: In Ermangelung einer Zeitreihe mit Monaten hab' ich das mal mit den AirPassengers-Daten durchgespielt.
Code: Alles auswählen
AirPassengers <- data.frame(AirPassengers)
AirPassengers$Return <- NA
for(i in 3:nrow(AirPassengers)){
AirPassengers$Return[i] <- AirPassengers$AirPassengers[i]/AirPassengers$AirPassengers[i-2] -1
}
Nachtrag vom Nachtrag: Einmal hin und zurück mit den 'normalen' Returns sieht dann so aus:
Code: Alles auswählen
AirPassengersDF <- data.frame(AirPassengers)
AirPassengersDF$MonthlyReturns <- NA
for(i in 2:nrow(AirPassengersDF)){
AirPassengersDF$MonthlyReturns[i] <- AirPassengersDF$AirPassengers[i]/AirPassengersDF$AirPassengers[i-1] -1
}
AirPassengersDF$Returns_3M <- NA
for(i in 3:nrow(AirPassengersDF)){
AirPassengersDF$Returns_3M[i] <- AirPassengersDF$AirPassengers[i]/AirPassengersDF$AirPassengers[i-2] -1
}
AirPassengersDF$Returns_3M_alt <- NA
for(i in 3:nrow(AirPassengersDF)){
AirPassengersDF$Returns_3M_alt[i] <- (1+AirPassengersDF$MonthlyReturns[i])*(1+AirPassengersDF$MonthlyReturns[i-1]) -1
}