Rollierende returns aus Dataframe

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
Lili94
Beiträge: 6
Registriert: Sa Apr 03, 2021 9:23 am

Rollierende returns aus Dataframe

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Rollierende returns aus Dataframe

Beitrag von EDi »

Bitte ein reproduzierbares Beispiel posten.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Lili94
Beiträge: 6
Registriert: Sa Apr 03, 2021 9:23 am

Re: Rollierende returns aus Dataframe

Beitrag 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
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Rollierende returns aus Dataframe

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Rollierende returns aus Dataframe

Beitrag 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
}
Antworten