计算R中的线性回报

时间:2017-10-03 13:33:41

标签: r finance

我有我认为是一个非常容易解决的问题,但我无法弄清楚出了什么问题。我的目标是计算线性股票收益,但下面的代码在尝试绘制线性收益时只返回一条直线。任何帮助都会受到赞赏,如果事实证明这是一个愚蠢的事情,我会事先为我的无知道歉,我是R的完全初学者并且编码一般。

    ```{r}
dataFF = read.csv("FF_Data_2016_11.csv", header = T, sep = ";")
dataFF$Date = dataFF$X.1 %/% 100 + (dataFF$X.1 %% 100 - 1) /12
dataFF[,3:(ncol(dataFF)-1)] = dataFF[,3:(ncol(dataFF)-1)] * 0.01
```

```{r}
dataie = read.csv("ie_data2016_11.csv", header = T, sep = ";", dec = ".", skip = 7, nrows = 1751)
dataie = as.data.frame(dataie[1:1751,1:11])
tsdata = ts(dataie, start = c(1871,1), frequency = 12)
dataie$date = seq(from = tsp(tsdata)[1], to = tsp(tsdata)[2], length.out = nrow(tsdata))
dataie = na.omit(dataie)
```

```{r}
# (log price, log div, YTM, div/monthly, Div/Price, log D/P)
dataie$log_p = log(dataie$P)
dataie$log_d = log(dataie$DIV)

dataie$ytm = dataie$GS10/100
dataie$div_m = dataie$DIV/12
dataie$DP = dataie$div_m/dataie$P
dataie$log_DP = log(dataie$DP)

```

```{r}
# linear monthly R with/without div
dataie$r_lin = dataie$P/lag(dataie$P,1)-1
dataie$r_linD = (dataie$P+dataie$div_m)/lag(dataie$P, -1)-1

示例数据:

 Date    P   DIV      E      CPI Fraction     GS10    Price Dividend
1881.01 6.19 0.265 0.4858 9.419420 1881.042 3.700000 158.9405 6.804400
1881.02 6.17 0.270 0.4817 9.514585 1881.125 3.693333 156.8424 6.863442
1881.03 6.24 0.275 0.4775 9.514585 1881.208 3.686667 158.6218 6.990543
1881.04 6.22 0.280 0.4733 9.609669 1881.292 3.680000 156.5489 7.047217

div_m          DP    log_DP r_lin      r_linD
0.02208333 0.003567582 -5.635867     0 0.003567582
0.02250000 0.003646677 -5.613939     0 0.003646677
0.02291667 0.003672543 -5.606871     0 0.003672543
0.02333333 0.003751340 -5.585642     0 0.003751340

1 个答案:

答案 0 :(得分:0)

我认为问题是lag运算符。它不适用于data.frame s

例如:

df=data.frame(x=1:4)
df$lx=lag(df$x)
df
  x lx
1 1  1
2 2  2
3 3  3
4 4  4

您需要将数据定义为使用lag运算符的时间序列。使用xts和您的Date列:

library(xts)
dataie=xts(dataie,order.by=as.Date(paste(dataie$Date,"01",sep="."),format="%Y.%m.%d"))

# linear monthly R with/without div
dataie$r_lin = dataie$P/lag(dataie$P,1)-1
dataie$r_linD = (dataie$P+dataie$div_m)/lag(dataie$P)-1

> dataie[,c(1:3,15:17)]
              Date    P   DIV    log_DP        r_lin       r_linD
1881-01-01 1881.01 6.19 0.265 -5.635867           NA           NA
1881-02-01 1881.02 6.17 0.270 -5.613939 -0.003231018 0.0004038772
1881-03-01 1881.03 6.24 0.275 -5.606871  0.011345219 0.0150594273
1881-04-01 1881.04 6.22 0.280 -5.585642 -0.003205128 0.0005341880