Frage

Ich versuche etwas Ähnliches zu tun, nach dem ich gefragt habe hier Und leider kann ich es nicht ausarbeiten.

Dies ist mein Datenrahmen (Daten), eine Zeitreihe von Preisen:

Date          Price   Vol
1998-01-01     200      0.3
1998-01-02     400      0.4
1998-01-03     600     -0.2
1998-01-04     100      0.1
...
1998-01-20     100      0.1
1998-01-21     200     -0.4
1998-01-21     500      0.06
....
1998-02-01     100      0.2
1998-02-02     200      0.4
1998-02-03     500      0.3
1998-02-04     100      0.1
etc.

Ich möchte r sagen, zu R

  • Nehmen Sie den 1. Wert von "Vol" und teilen Sie ihn dann durch den 20. Wert von "Preis"
  • Nehmen Sie den 2. Wert von "Vol" und teilen Sie ihn dann durch den 21. Wert "Preis".
  • Nehmen Sie den 3. Wert von "Vol" und teilen Sie ihn dann durch den 22. Wert von "Preis"
  • usw.

In meinem anderen Beitrag konnte ich diese Funktion verwenden, um eine Rendite über einen Haltedauer von 20 Tagen zu berechnen:

> data.xts <- xts(data[, -1], data[, 1])
> hold <- 20
> f <- function(x) log(tail(x, 1)) - log(head(x, 1))
> data.xts$returns.xts <- rollapply(data.xts$Price, FUN=f, 
  width=hold+1, align="left", na.pad=T)

Gibt es eine Möglichkeit, für das oben angegebene Problem etwas sehr Ähnliches zu tun? Also so etwas wie

f1 <- function(x,y) head(x, 1) / tail(y,1)

Wo ist X "Vol" und Y "Preis" und dann "Rollapply" anwenden?

Vielen Dank

Update: @ Dr. G: Danke für Ihre Vorschläge. Mit einer leichten Veränderung tat es, was ich wollte!

data.xts <- xts(data[, -1], data[, 1])
hold <- 20
data.xts$quo <- lag(data.xts[,2], hold) / data.xts[,1]

Mein Problem ist nun, dass der resultierende Datenrahmen folgendermaßen aussieht:

    Date          Price   Vol     quo
1 1998-01-01     200      0.3     NA
2 1998-01-02     400      0.4     NA
3 1998-01-03     600     -0.2     NA
4 1998-01-04     100      0.1     NA
...
21 1998-01-20    180      0.2     0.003 

Ich weiß, dass es NAs als Ergebnis geben muss, aber nur für die letzten 20 Beobachtungen, nicht für die ersten 20. Die oben angegebene Formel berechnet die richtigen Werte, stellt sie jedoch in der 21. Zeile anstelle der ersten Zeile ab. Weißt du, wie ich das ändern könnte?

War es hilfreich?

Lösung

Es ist eigentlich einfacher als das. Mach das einfach:

data.xts <- xts(data[, -1], data[, 1])
hold <- 20
returns.xts = data.xts[,2] / lag(data.xts[,1], hold)

Tatsächlich würde auch dafür auch Zoo anstelle von XTs funktionieren:

data.zoo<- zoo(data[, -1], data[, 1])
hold <- 20
returns.zoo = data.zoo[,2] / lag(data.zoo[,1], -hold)

Das einzige, was sich ändert, ist das Zeichen der Verzögerungen (Zoo -Konvention unterscheidet sich von XTS)

Andere Tipps

Verwenden by.column = FALSE in rollapply. Um die veröffentlichten Daten zu verwenden, werden wir das Volumen in der ersten Reihe durch den Preis in der 3. Zeile usw. zum Zwecke der reproduzierbaren Illustration teilen:

library(zoo)

Lines <- "Date          Price   Vol
1998-01-01     200      0.3
1998-01-02     400      0.4
1998-01-03     600     -0.2
1998-01-04     100      0.1
1998-01-20     100      0.1
1998-01-21     200     -0.4
1998-01-21     500      0.06
1998-02-01     100      0.2
1998-02-02     200      0.4
1998-02-03     500      0.3
1998-02-04     100      0.1"


# read in and use aggregate to remove all but last point in each day.
# In reality we would replace textConnection(Lines) with something 
#  like "myfile.dat"

z <- read.zoo(textConnection(Lines), header = TRUE, 
       aggregate = function(x) tail(x, 1))

# divide Volume by the Price of the point 2 rows ahead using by.column = FALSE
# Note use of align = "left" to align with the volume.
# If we used align = "right" it would align with the price.

rollapply(z, 3, function(x) x[1, "Vol"] / x[3, "Price"], by.column = FALSE,
    align = "left")

# and this is the same as rollapply with align = "left" as above
z$Vol / lag(z$Price, 2)

# this is the same as using rollapply with align = "right"
lag(z$Vol, -2) / z$Price

Beachten Sie übrigens zoo verwendet die gleiche Konvention für das Zeichen von lag ebenso wie R aber xts Verwendet die entgegengesetzte Konvent xts Sie müssen die Verzögerungen negieren.

Sie müssen nur verwenden

data.xts$quo <- data.xts[,2] / lag( data.xts[,1], -hold)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top