【问题标题】:R: Calculating cumulative return of a portfolioR:计算投资组合的累积回报
【发布时间】:2019-03-04 09:11:44
【问题描述】:

我使用 quantmod-package 从雅虎下载了调整后的收盘价,并用它创建了一个由 50% AAPL- 和 50% FB-stocks 组成的投资组合。

当我绘制我的投资组合的累积表现时,我得到的表现(可疑)很高,因为它高于 100%:

library(ggplot2)
library(quantmod)

cmp <- "AAPL"
getSymbols(Symbols = cmp)
tail(AAPL$AAPL.Adjusted)

cmp <- "FB"
getSymbols(Symbols = cmp)
tail(FB$FB.Adjusted)


df <- data.frame("AAPL" = tail(AAPL$AAPL.Adjusted, 1000),
                 "FB"   = tail(FB$FB.Adjusted, 1000))

for(i in 2:nrow(df)){
  df$AAPL.Adjusted_prc[i] <- df$AAPL.Adjusted[i]/df$AAPL.Adjusted[i-1]-1
  df$FB.Adjusted_prc[i] <- df$FB.Adjusted[i]/df$FB.Adjusted[i-1]-1
}

df <- df[-1,]
df$portfolio   <- (df$AAPL.Adjusted_prc + df$FB.Adjusted_prc)*0.5
df$performance <- cumprod(df$portfolio+1)-1
df$idu <- as.Date(row.names(df))

ggplot(data = df, aes(x = idu, y = performance)) + geom_line()

对我来说,超过 100% 的累积表现似乎很不现实。这让我想到,也许有必要在使用之前调整/缩放从quantmod 下载的数据?

【问题讨论】:

  • AAPL 现在的交易价格约为 175 美元。 2015 年 3 月,它约为 118 美元,根据拆分和股息进行了调整。 FB 大约是 162 美元,当时大约是 80 美元。这些数字看起来与您的回报率一致,比 100% 更接近 85%。

标签: r finance quantmod yahoo-api quantitative-finance


【解决方案1】:

我一直在为这个问题苦苦挣扎,我感觉它下面存在数据问题。为了证明这一点,我正在使用两种方法计算累积回报。结果显示了一些我无法真正解释的差异 - 因此,您可以先看看这些。

首先,我运行你的代码:

library(quantmod)
library(tidyverse

cmp <- "AAPL"
getSymbols(Symbols = cmp)
tail(AAPL$AAPL.Adjusted)

cmp <- "FB"
getSymbols(Symbols = cmp)
tail(FB$FB.Adjusted)


df <- data.frame("AAPL" = tail(AAPL$AAPL.Adjusted, 1000),
                 "FB"   = tail(FB$FB.Adjusted, 1000))

for(i in 2:nrow(df)){
  df$AAPL.Adjusted_prc[i] <- df$AAPL.Adjusted[i]/df$AAPL.Adjusted[i-1]-1
  df$FB.Adjusted_prc[i] <- df$FB.Adjusted[i]/df$FB.Adjusted[i-1]-1
}

然后我手动计算累积回报,方法是将当前值除以起始值(即第 1 行中的价格)并减去 1。此外,我cumsum'ing 两只股票的回报分开。

df$aapl_man <- df$AAPL.Adjusted / df$AAPL.Adjusted[1] - 1
df$fb_man <- df$FB.Adjusted / df$FB.Adjusted[1] - 1

df <- df[-1,]
df$portfolio   <- (df$AAPL.Adjusted_prc + df$FB.Adjusted_prc)*0.5
df$performance <- cumprod(df$portfolio+1)-1
df$idu <- as.Date(row.names(df))

df <- mutate_at(df, vars(contains("_prc")), cumsum)

现在,我正在绘制 cumsum 回报(蓝色)和手动计算的回报(红色)。

df %>%
  ggplot(aes(x = idu)) +
  geom_line(aes(y = AAPL.Adjusted_prc), colour = "blue") +
  geom_line(aes(y = aapl_man), colour = "red") +
  ggtitle("Apple")

df %>%
  ggplot(aes(x = idu)) +
  geom_line(aes(y = FB.Adjusted_prc), colour = "blue") +
  geom_line(aes(y = fb_man), colour = "red") +
  ggtitle("Facebook")

特别是对于 Facebook,我们发现这两种方法之间存在很大差异。很抱歉我无法解决您的问题,但我希望这将引导您找到解决方案。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 2018-02-19
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多