标签: performanceanalytics

ggplot版本的chart.PerformanceSummary

我想charts.PerformanceSummaryPerformanceAnalytics包中提供一个"ggplot版本"的基本功能,因为我认为ggplot通常更漂亮,理论上在编辑图像方面更强大.我已经相当接近,但有一些问题,我想要一些帮助.即:

  1. 减少图例占用的空间量,当它上面有10行以上时会变得可怕/丑陋...(只是线条颜色和名称就足够了)
  2. 增加Daily_Returns facet的大小以匹配chart.PerformanceSummary的大小 PerformanceAnalytics
  3. 有一个选项可以指定在Daily_Returns facet的每日回复系列中显示哪个资产,而不是总是使用第一列,这比在 charts.PerformanceSummary

如果有更好的方法来做这个可能使用gridExtra而不是方面...我不会对那些让我看起来会更好看的人感到不利...

这里的问题是美学,而且我觉得潜在易操作,因为PerformanceAnalytics已经有一个很好的工作示例,我只想让它更漂亮/更专业......

除了这个奖励积分之外,我希望能够在每个资产的图表一侧或下方某处显示与之相关的一些性能统计数据......不太确定哪里最好显示或显示此信息.

此外,如果他们对此提出建议,我并不反对人们建议清理我的代码的部分.

这是我可重复的例子......

首先生成返回数据:

require(xts)
X.stock.rtns <- xts(rnorm(1000,0.00001,0.0003), Sys.Date()-(1000:1))
Y.stock.rtns <- xts(rnorm(1000,0.00003,0.0004), Sys.Date()-(1000:1))
Z.stock.rtns <- xts(rnorm(1000,0.00005,0.0005), Sys.Date()-(1000:1))
rtn.obj <- merge(X.stock.rtns , Y.stock.rtns, Z.stock.rtns)
colnames(rtn.obj) <- c("x.stock.rtns","y.stock.rtns","z.stock.rtns")
Run Code Online (Sandbox Code Playgroud)

我想复制以下结果的图像:

require(PerformanceAnalytics)
charts.PerformanceSummary(rtn.obj, geometric=TRUE)
Run Code Online (Sandbox Code Playgroud)

目标

这是我到目前为止的尝试......

gg.charts.PerformanceSummary <- function(rtn.obj, geometric=TRUE, main="",plot=TRUE){

    # load libraries
suppressPackageStartupMessages(require(ggplot2))
suppressPackageStartupMessages(require(scales))
suppressPackageStartupMessages(require(reshape))
suppressPackageStartupMessages(require(PerformanceAnalytics))
    # create function to clean returns if having NAs in data
    clean.rtn.xts <- function(univ.rtn.xts.obj,na.replace=0){
    univ.rtn.xts.obj[is.na(univ.rtn.xts.obj)]<- na.replace
    univ.rtn.xts.obj
}
    # Create cumulative …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 performanceanalytics

7
推荐指数
2
解决办法
3904
查看次数

使用sparklyr对大数据进行rollapply

我想估计大约2250万个观测数据集的滚动风险值,因此我想使用sparklyr进行快速计算.这是我做的(使用示例数据库):

library(PerformanceAnalytics)
library(reshape2)
library(dplyr)

data(managers)
data <- zerofill(managers)
data<-as.data.frame(data)
class(data)
data$date=row.names(data)
lmanagers<-melt(data, id.vars=c('date'))
Run Code Online (Sandbox Code Playgroud)

现在我估计使用dplyr和PerformanceAnalytics包的VaR:

library(zoo) # for rollapply()
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T))
Run Code Online (Sandbox Code Playgroud)

这很好用.现在我这样做是为了使用sparklyr:

library(sparklyr)
sc <- spark_connect(master = "local")
lmanagers_sp <- copy_to(sc,lmanagers)
src_tbls(sc)

var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>% 
  collect
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误:

Error: Unknown input type: pairlist
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我哪里出错,什么是正确的代码?或者任何其他更快地估算滚动VaR的解决方案也是值得赞赏的.

r performanceanalytics dplyr rollapply sparklyr

7
推荐指数
1
解决办法
615
查看次数

使用R估计风险滚动值(VaR)

我需要对每日股票收益进行滚动VaR估计.起初我做了以下事情:

library(PerformanceAnalytics)
data(edhec)
sample<-edhec[,1:5]
var605<-rollapply(as.zoo(sample),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)
Run Code Online (Sandbox Code Playgroud)

它执行计算并返回一个zoo对象,但给出了一系列警告,如下所示:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00030977098532231 
Run Code Online (Sandbox Code Playgroud)

然后,我尝试了同样的数据样本,如下所示:

library(foreign)
sample2 <- read.dta("sample2.dta")
sample2.xts <- xts(sample2[,-1],order.by=as.Date(sample2$datadate,format= "%Y-%m-%d"))
any(is.na(sample2.xts))
var605<-rollapply(as.zoo(sample2.xts),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)
Run Code Online (Sandbox Code Playgroud)

但是不会返回任何动物园对象并给出以下警告和错误:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.0077322590200255
Error in if (eval(tmp < 0)) { : missing value where TRUE/FALSE needed
Called from: top level
Run Code Online (Sandbox Code Playgroud)

从之前的文章(使用rollapply函数进行使用R的VaR计算)我理解,如果缺少完整的滚动窗口,则无法执行滚动估计,但在我的数据(sample2.dta)中没有缺失值.

sample2.dta可以从https://drive.google.com/file/d/0B8usDJAPeV85WDdDQTFEbGQwaUU/edit?usp=sharing下载

有谁可以帮我解决和理解这个问题?

r computational-finance performanceanalytics rollapply

6
推荐指数
1
解决办法
2702
查看次数

R包'performanceanalytics'优化器中的最大资产数量

这只是关于我可以在r performanceanalytics优化器函数中使用的最大库存数量的一般问题.

我的代码适用于优化大约110个资产的任何东西,但是超出这个范围的任何东西都会产生错 我找不到任何有关实际资产数量限制的文档.任何帮助表示赞赏.

除此之外,我在下面添加了可重现的代码示例:

library(xts)
library(PortfolioAnalytics)
num_stocks = 300
num_periods = 200

rets = replicate(num_stocks, rnorm(num_periods))
colnames(rets) = paste0('stock', 1:num_stocks)

dates = seq(as.Date('2000-01-01'), by = 'month', length.out = num_periods) - 1




#100 stocks, returns optimal weights
equity.data = xts(rets, order.by = dates)[,1:100]

stocks <- colnames(equity.data)

# Specify an initial portfolio
portf.init <- portfolio.spec(stocks)

# Add constraints
# weights sum to 1
portf.minvar <- add.constraint(portf.init, type="full_investment")
# box constraints
portf.minvar <- add.constraint(portf.minvar, type="box", min=0.00, max=0.10)

# Add objective
# objective …
Run Code Online (Sandbox Code Playgroud)

optimization r performanceanalytics r-portfolioanalytics

6
推荐指数
1
解决办法
307
查看次数

更快速地替代功能'rollapply'

我需要在xts数据上运行滚动窗口函数,该数据包含大约7,000行和11,000列.我做了以下事情:

require(PerformanceAnalytics)
ssd60<-rollapply(wddxts,width=60,FUN=function(x) SemiDeviation(x),by.column=TRUE)
Run Code Online (Sandbox Code Playgroud)

我等了12个小时,但计算没有完成.但是,当我尝试使用小数据集时,如下所示:

sample<-wddxts[,1:5]
ssd60<-rollapply(sample,width=60,FUN=function(x) SemiDeviation(x),by.column=TRUE)
Run Code Online (Sandbox Code Playgroud)

计算在60秒内完成.我在配备Intel i5-2450M CPU,Windows 7操作系统和12 GB RAM的计算机上运行它们.

任何人都可以建议我,如果有更快的方法在大型xts数据集上执行上述计算?

r zoo xts performanceanalytics rollapply

5
推荐指数
1
解决办法
1731
查看次数

R 经济衰退日期转换

我正在通过将衰退带数据下载到 R 中quantmod。现在这是一个二进制信息(xts 格式),看起来像这样(仅显示第一个衰退期)

1857-01-01  0
1857-02-01  0
1857-03-01  0
1857-04-01  0
1857-05-01  0
1857-06-01  0
1857-07-01  1
1857-08-01  1
1857-09-01  1
1857-10-01  1
1857-11-01  1
1857-12-01  1
1858-01-01  1
1858-02-01  1
1858-03-01  1
1858-04-01  1
1858-05-01  1
1858-06-01  1
1858-07-01  1
1858-08-01  1
1858-09-01  1
1858-10-01  1
1858-11-01  1
1858-12-01  1
Run Code Online (Sandbox Code Playgroud)

现在,我有两个问题:

  1. 我想确定每个衰退期的开始和结束时间(即获取开始和结束日期)。由于存在没有衰退的中间零,所以我需要一个过滤机制,a)过滤掉零(这很容易),b)确保识别每个新的衰退期。仅仅选择这些还不够,因为那时不存在单独的衰退期,而只是发生衰退的日期的集合。
  2. 我需要将其转换为这样的表格格式,如下所示 http://www.r-bloggers.com/use-geom_rect-to-add-recession-bars-to-your-time-series-plots-rstats -ggplot/

    1857-06-01, 1858-12-01 1860-10-01, 1861-06-01 1865-04-01, 1867-12-01 1869-06-01, 1870-12-01 1873-10-01, 1879-03-01

完成此操作后,我想将其用作库中的 event.lines PerformanceAnalytics

有人可以帮助我如何做到这一点吗?

如果您想下载该系列进行尝试,请执行以下操作

library(quantmod)
getSymbols("USREC",src="FRED")
Run Code Online (Sandbox Code Playgroud)

r quantmod performanceanalytics

4
推荐指数
1
解决办法
1857
查看次数

R中的NA的累积回报

我有以下数据框:

df <- data.frame(Return1=c(NA, NA, .03, .04, .05),
             Return2=c(.25, .33, NA, .045, .90),
             Return3=c(.04, .073, .08, .04, .01))


  Return1 Return2 Return3
1      NA   0.250   0.040
2      NA   0.330   0.073
3    0.03      NA   0.080
4    0.04   0.045   0.040
5    0.05   0.900   0.010
Run Code Online (Sandbox Code Playgroud)

我想计算累积回报,但数据框中缺少值.我用了:

cumprod(df+1)-1
Run Code Online (Sandbox Code Playgroud)

得到结果

  Return1 Return2   Return3
1      NA  0.2500 0.0400000
2      NA  0.6625 0.1159200
3      NA      NA 0.2051936
4      NA      NA 0.2534013
5      NA      NA 0.2659354
Run Code Online (Sandbox Code Playgroud)

这里的问题是,如果存在NA,则后续的行将具有结果NA.有没有办法计算累积回报而没有NA影响下面其余的行?

我想得到的结果是:

  Return1 Return2   Return3
1      NA  0.2500 0.0400000
2      NA  0.6625 0.1159200 …
Run Code Online (Sandbox Code Playgroud)

r na performanceanalytics

4
推荐指数
1
解决办法
1517
查看次数

尝试创建滚动期cummax

我正在尝试创建一个购买N期新高的函数。因此,如果我有一个向量:

  x = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

我想把滚动期提高到3个周期。这就是我希望功能看起来的样子

 x =  c(1, 2, 3, 4, 5, 5, 5, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

我试图在xts对象上执行此操作。这是我尝试过的:

    rollapplyr(SPY$SPY.Adjusted, width = 40, FUN = cummax)
    rollapply(SPY$SPY.Adjusted, width = 40, FUN = "cummax")
    rapply(SPY$SPY.Adjusted, width  = 40, FUN = cummax)
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

      Error in `dimnames<-.xts`(`*tmp*`, value = dn) : 
      length of 'dimnames' [2] not equal to array extent
Run Code Online (Sandbox Code Playgroud)

提前致谢

r xts quantmod performanceanalytics

3
推荐指数
1
解决办法
59
查看次数

在R中使用历史方法对组件VaR没有贡献

我是R.的新手.我正在使用"PerformanceAnalytics"软件包来计算投资组合的组件VaR.

如果我使用高斯方法,它会返回贡献.

> VaR(edhec, p=.95, method="gaussian", portfolio_method="component")
no weights passed in, assuming equal weighted portfolio
$VaR
           [,1]
[1,] 0.01193358

$contribution
 Convertible Arbitrage             CTA Global  Distressed Securities       Emerging Markets  Equity Market Neutral           Event Driven Fixed Income Arbitrage 
          0.0014400703           0.0003687009           0.0012961865           0.0032090406           0.0003479361           0.0013848605           0.0010051944 
          Global Macro      Long/Short Equity       Merger Arbitrage         Relative Value          Short Selling         Funds of Funds 
          0.0011151866           0.0015860006           0.0004412756           0.0009265836          -0.0027498306           0.0015623733 

$pct_contrib_VaR
 Convertible Arbitrage             CTA Global  Distressed Securities       Emerging Markets  Equity Market Neutral           Event Driven Fixed Income …
Run Code Online (Sandbox Code Playgroud)

finance r performanceanalytics

2
推荐指数
1
解决办法
575
查看次数

为什么3种算法的平均时间为负?

我必须使用大小为10000到50000且步长为10000的数组,为所有三种算法提供相同的输入,并且对于每个输入重复执行100次,以纳秒为单位测量执行(使用System.nanoTime()),并以毫秒为单位报告平均时间.这就是我在下面所做的,但有些平均值是负数,我不知道为什么?

import java.util.Arrays;

public class Sort{

   public static void main(String[]args){

      double[] arr5 = new double[50000];

      for(int i=0;i<arr5.length;i++)
         arr5[i] = Math.random();

      selectionSort(arr5,10000);
      bubbleSort(arr5,10000);
      quickSort(arr5,10000);

      selectionSort(arr5,20000);
      bubbleSort(arr5,20000);
      quickSort(arr5,20000);

      selectionSort(arr5,30000);
      bubbleSort(arr5,30000);
      quickSort(arr5,30000);

      selectionSort(arr5,40000);
      bubbleSort(arr5,40000);
      quickSort(arr5,40000);

      selectionSort(arr5,50000);
      bubbleSort(arr5,50000);
      quickSort(arr5,50000);
   }

   public static void selectionSort(double [] A,int n){
      int sum = 0;
      System.out.println("Algorithm 1");
      for(int s=0;s<100;s++){
         long arr[] = new long[100];

         long startTime = System.nanoTime();

         for(int i=0;i<n-1;i++){
            int min = i;
            for(int j=i+1;j<n;j++){
               if(A[j] < A[min])
                  min=j;}
            double tmp = A[i];
            A[i] = A[min];
            A[min]=tmp;} …
Run Code Online (Sandbox Code Playgroud)

java algorithm analysis time-complexity performanceanalytics

1
推荐指数
1
解决办法
87
查看次数