2017-06-29 70 views
0

我正在使用包tidyverse和tidyquant將數據幀轉換爲XTS對象。將數據幀轉換爲XTS以用於PortfolioAnalytics包中的正確方法

library(tidyverse) 
library(tidyquant) 

xts <- na.omit(as.data.frame(new.df)) 
xts <- as_xts(xts, Date) 

似乎成功:

> str(xts) 
An ‘xts’ object on 1981-01-29/2017-06-28 containing: 
    Data: chr [1:9184, 1:36] "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" "$SPX" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:36] "Ticker" "Open" "High" "Low" ... 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
NULL 

XTS對象作爲印刷

接下來我期待這個裝入性能analystic包。我提取我想要加載到包中的列。

data=xts[,35] 

然後str(數據)再次顯示一個xts對象。

> str(data) 
An ‘xts’ object on 1981-01-29/2017-06-28 containing: 
    Data: chr [1:9184, 1] "-7.671475e-02" "-5.297988e-01" "-2.037823e+00" " 1.221346e+00" " 1.011910e-01" " 8.087721e-01" " 7.482913e-01" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr "long_exit_eq" 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
NULL 

這仍然是一個日期列,頭一個XTS對象(數據):

> head(data) 
      long_exit_eq 
1981-01-29 "-7.671475e-02" 
1981-01-30 "-5.297988e-01" 
1981-02-02 "-2.037823e+00" 
1981-02-03 " 1.221346e+00" 
1981-02-04 " 1.011910e-01" 
1981-02-05 " 8.087721e-01" 

對於投資組合分析:

> # create table of downside risk estimates 
> table.DownsideRisk(data) 
Error in MAR - r : non-numeric argument to binary operator 
In addition: Warning message: 
In mean.default(coredata(x), ...) : 
    argument is not numeric or logical: returning NA 
> # chart equity curve, daily performance, and drawdowns 
> charts.PerformanceSummary(data) 
Error in na.omit.xts(x) : unsupported type 

上面我不知道該錯誤他們爲什麼發生。 na.omit.xts ...數據集中沒有na值。我在開始的時候刪除了它們,當時我正在使用一個數據幀:xts <- na.omit(as.data.frame(new.df))

dataframe to xts對象似乎正在工作,拉動我想要在投資組合分析中使用的列似乎正在工作。

只是爲了顯示我的XTS對象的你的頭:

> head(xts) 
      Ticker Open  High  Low  Close  Volume  Open.Interest roll.mean.n3 roll.mean.n5 roll.mean.n7 
1981-01-29 "$SPX" " 130.34" " 131.78" " 128.97" " 130.24" " 26900000" "0"   " 130.5667" " 130.354" " 130.4843" 
1981-01-30 "$SPX" " 130.24" " 131.65" " 128.61" " 129.55" " 29100000" "0"   " 130.0433" " 130.218" " 130.2257" 
1981-02-02 "$SPX" " 129.48" " 129.48" " 125.82" " 126.91" " 29100000" "0"   " 128.9000" " 129.632" " 129.7471" 
1981-02-03 "$SPX" " 126.91" " 128.92" " 125.89" " 128.46" " 33400000" "0"   " 128.3067" " 129.100" " 129.4943" 
1981-02-04 "$SPX" " 128.46" " 129.71" " 127.29" " 128.59" " 32600000" "0"   " 127.9867" " 128.750" " 129.3157" 
1981-02-05 "$SPX" " 128.59" " 130.49" " 127.99" " 129.63" " 33900000" "0"   " 128.8933" " 128.628" " 129.1029" 
      roll.mean.n10 roll.mean.n12 roll.mean.n14 roll.mean.n17 roll.mean.n20 roll.sd.n3 roll.sd.n5 roll.sd.n7 roll.sd.n10 
1981-01-29 " 131.418" " 131.8225" " 132.0486" " 132.3706" " 133.1365" " 0.48179878" " 0.4689130" " 0.5449115" " 1.7603142" 
1981-01-30 " 130.896" " 131.4958" " 131.7650" " 132.0453" " 132.7970" " 0.43015730" " 0.5954159" " 0.4864105" " 1.3911236" 
1981-02-02 " 130.150" " 130.8867" " 131.3093" " 131.6835" " 132.2440" " 1.75758738" " 1.6202694" " 1.3422092" " 1.3195694" 
1981-02-03 " 129.831" " 130.3608" " 130.9514" " 131.3882" " 131.7610" " 1.32666306" " 1.4357411" " 1.4014972" " 1.3021291" 
1981-02-04 " 129.554" " 129.8792" " 130.5493" " 131.0982" " 131.4365" " 0.93468608" " 1.2604983" " 1.4294622" " 1.2335503" 
1981-02-05 " 129.491" " 129.7108" " 130.1821" " 130.8829" " 131.2650" " 0.64127139" " 1.0994631" " 1.2101207" " 1.2093379" 
      roll.sd.n12 roll.sd.n14 roll.sd.n17 roll.sd.n20 roll.z.score.n3 roll.z.score.n5 roll.z.score.n7 roll.z.score.n10 
1981-01-29 " 1.8583186" " 1.8039775" " 1.8166778" " 2.5260546" "-6.780009e-01" "-2.430984e-01" "-4.482851e-01" "-0.6691924632" 
1981-01-30 " 1.8867068" " 1.8658535" " 1.7961940" " 2.5291296" "-1.146875e+00" "-1.121908e+00" "-1.389185e+00" "-0.9675624607" 
1981-02-02 " 2.0957110" " 2.2117916" " 2.1612750" " 2.5475899" "-1.132236e+00" "-1.679969e+00" "-2.113787e+00" "-2.4553457398" 
1981-02-03 " 1.8040970" " 2.2404173" " 2.2419181" " 2.2761866" " 1.155832e-01" "-4.457586e-01" "-7.379812e-01" "-1.0528840651" 
1981-02-04 " 1.3511217" " 2.1100825" " 2.2676411" " 2.2404529" " 6.454894e-01" "-1.269371e-01" "-5.076854e-01" "-0.7814849363" 
1981-02-05 " 1.2309297" " 1.7326141" " 2.2197845" " 2.2409161" " 1.148754e+00" " 9.113521e-01" " 4.356094e-01" " 0.1149372685" 
      roll.z.score.n12 roll.z.score.n14 roll.z.score.n17 roll.z.score.n20 ocret   clret   sig_long long_exit_eq 
1981-01-29 "-8.515704e-01" "-1.002540e+00" "-1.1727875453" "-1.146645e+00" "-7.671475e-02" "-7.671475e-02" "1"  "-7.671475e-02" 
1981-01-30 "-1.031338e+00" "-1.187124e+00" "-1.3892112666" "-1.283841e+00" "-5.297988e-01" "-5.297988e-01" "1"  "-5.297988e-01" 
1981-02-02 "-1.897526e+00" "-1.989014e+00" "-2.2086630159" "-2.093743e+00" "-1.984863e+00" "-2.037823e+00" "1"  "-2.037823e+00" 
1981-02-03 "-1.053615e+00" "-1.112033e+00" "-1.3061247727" "-1.450228e+00" " 1.221346e+00" " 1.221346e+00" "1"  " 1.221346e+00" 
1981-02-04 "-9.541455e-01" "-9.285351e-01" "-1.1060986231" "-1.270502e+00" " 1.011910e-01" " 1.011910e-01" "1"  " 1.011910e-01" 
1981-02-05 "-6.566920e-02" "-3.186762e-01" "-0.5644427193" "-7.296121e-01" " 8.087721e-01" " 8.087721e-01" "1"  " 8.087721e-01" 
      cum_eq_long_exit 
1981-01-29 " -1.06592882" 
1981-01-30 " -1.59572761" 
1981-02-02 " -3.63355084" 
1981-02-03 " -2.41220501" 
1981-02-04 " -2.31101398" 
1981-02-05 " -1.50224192" 

我失去了地球上的什麼位置?

編輯**

這是我new.df的格式轉換爲XTS之前....

> str(new.df) 
'data.frame': 9203 obs. of 37 variables: 
$ Date   : Date, format: "1981-01-02" "1981-01-05" "1981-01-06" "1981-01-07" ... 
$ Ticker   : chr "$SPX" "$SPX" "$SPX" "$SPX" ... 
$ Open   : num 136 136 138 136 135 ... 
$ High   : num 137 139 140 136 136 ... 
$ Low    : num 135 136 136 132 132 ... 
$ Close   : num 136 138 138 135 133 ... 
$ Volume   : num 19400000 41200000 49000000 58800000 39400000 35900000 34600000 28500000 28900000 27100000 ... 
$ Open.Interest : int 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.mean.n3 : num 0 0 137 137 135 ... 
$ roll.mean.n5 : num 0 0 0 0 136 ... 
$ roll.mean.n7 : num 0 0 0 0 0 ... 
$ roll.mean.n10 : num 0 0 0 0 0 ... 
$ roll.mean.n12 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.mean.n14 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.mean.n17 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.mean.n20 : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.sd.n3  : num 0 0 0.987 1.713 2.547 ... 
$ roll.sd.n5  : num 0 0 0 0 2.12 ... 
$ roll.sd.n7  : num 0 0 0 0 0 ... 
$ roll.sd.n10  : num 0 0 0 0 0 ... 
$ roll.sd.n12  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.sd.n14  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.sd.n17  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.sd.n20  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.z.score.n3 : num 0 0 0.652 -1.154 -0.927 ... 
$ roll.z.score.n5 : num 0 0 0 0 -1.44 ... 
$ roll.z.score.n7 : num 0 0 0 0 0 ... 
$ roll.z.score.n10: num 0 0 0 0 0 ... 
$ roll.z.score.n12: num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.z.score.n14: num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.z.score.n17: num 0 0 0 0 0 0 0 0 0 0 ... 
$ roll.z.score.n20: num 0 0 0 0 0 0 0 0 0 0 ... 
$ ocret   : num 0.427 1.196 0.109 -0.691 -1.495 ... 
$ clret   : num 0 1.196 0.109 -2.201 -1.495 ... 
$ sig_long  : num [1:9203, 1] 0 0 0 0 0 0 0 0 0 0 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr "Lag.1" 
$ long_exit_eq : num 0 0 0 0 0 0 0 0 0 0 ... 
$ cum_eq_long_exit: num 0 0 0 0 0 0 0 0 0 0 ... 

回答

2

,因爲你的數據是字符您收到不受支持的類型錯誤。結構調用(str)將其顯示爲Data:chr ...您還可以通過查看輸出結果來告訴它,數字周圍的引號表示它們是字符。您需要數字值爲charts.PerformanceSummary函數。我不確定你的數據框是什麼樣的,但是要麼嘗試將數據框的值轉換爲數字值,請參閱as.numeric,或者將數據作爲數字值加入以避免數據框全部一起。 Quantmod中的getSymbols函數可以將財務數據作爲xts。

https://stat.ethz.ch/R-manual/R-devel/library/base/html/numeric.htmlhttp://www.quantmod.com/documentation/getSymbols.html

1

我找到了解決辦法。將整個數據幀轉換爲XTS時。即使數據框的原始格式正確,即date = date和numbers = num。 XTS轉換將導致格式改變。因此,爲什麼數字更改爲字符,從而導致PortfolioAnalytics包發生錯誤。

這裏的答案是從數據框中提取特定列。將其轉換爲XTS,同時在此過程中保持正確的格式。下面

的保留數字格式,同時從數據幀轉換爲XTS:

xts = xts(new.df$long_exit_eq, order.by=as.Date(new.df$Date, format="%m/%d/%Y")) 

如果你想從數據幀拉兩列。讓我們說你的信號返回列併購買並持有返回列。

可以從下面的數據框中將它們拉到xts然後將它們綁定在一起。

# Pull select columns from data frame to make XTS whilst retaining formats 
xts = xts(new.df$long_exit_eq, order.by=as.Date(new.df$Date, format="%m/%d/%Y")) 
xts1 = xts(new.df$clret, order.by=as.Date(new.df$Date, format="%m/%d/%Y")) 

# Join XTS together 
compare <- cbind(xts,xts1) 
+0

'這裏的答案是將特定列從數據框中提取出來。將其轉換爲XTS,同時在過程中保持正確的格式 - - 正好! – AK88