[英]Passing optimization function arguments in R DEoptim
I am trying to learn the DEoptim
library in R but I think I am misunderstanding the library documentation from 我正在尝试学习R中的DEoptim
库,但是我误解了
https://www.rdocumentation.org/packages/DEoptim/versions/2.2-4/topics/DEoptim https://www.rdocumentation.org/packages/DEoptim/versions/2.2-4/topics/DEoptim
I am getting the error argument "returns_covar" is missing, with no default
when I try the code below 我在尝试以下代码时收到错误argument "returns_covar" is missing, with no default
The function I am trying to optimize (minimize) is: 我正在尝试优化(最小化)的函数是:
calculate_portfolio_variance <- function(allocations, returns_covar)
{
# Name: calculate_portfolio_variance
# Purpose: Computes expected portfolio variance, to be used as the minimization objective function
# Input: allocations = vector of allocations to be adjusted for optimality; returns_covar = covariance matrix of stock returns
# Output: Expected portfolio variance
portfolio_variance <- allocations%*%returns_covar%*%t(allocations)
return(portfolio_variance)
}
filter_and_sort_symbols <- function(symbols)
{
# Name: filter_and_sort_symbols
# Purpose: Convert to uppercase if not
# and remove any non valid symbols
# Input: symbols = vector of stock tickers
# Output: filtered_symbols = filtered symbols
# convert symbols to uppercase
symbols <- toupper(symbols)
# Validate the symbol names
valid <- regexpr("^[A-Z]{2,4}$", symbols)
# Return only the valid ones
return(sort(symbols[valid == 1]))
}
# Create the list of stock tickers and check that they are valid symbols
tickers <- filter_and_sort_symbols(c("XLE", "XLB", "XLI", "XLY", "XLP", "XLV", "XLK", "XLU", "SHY", "TLT"))
# Set the start and end dates
start_date <- "2013-01-01"
end_date <- "2014-01-01"
# Gather the stock data using quantmod library
getSymbols(Symbols=tickers, from=start_date, to=end_date, auto.assign = TRUE)
# Create a matrix of only the adj. prices
price_matrix <- NULL
for(ticker in tickers){price_matrix <- cbind(price_matrix, get(ticker)[,6])}
# Set the column names for the price matrix
colnames(price_matrix) <- tickers
# Compute log returns
returns_matrix <- apply(price_matrix, 2, function(x) diff(log(x)))
returns_covar <- cov(returns_matrix)
# Specify lower and upper bounds for the allocation percentages
lower <- rep(0, ncol(returns_matrix))
upper <- rep(1, ncol(returns_matrix))
# Calculate the optimum allocation; THIS CAUSES AN ERROR
set.seed(1234)
optim_result <- DEoptim(calculate_portfolio_variance, lower, upper, control = list(NP=100, itermax=300, F=0.8, CR=0.9, allocations, returns_covar))
Again, the error from the last line is that the returns_covar
argument is missing, but I try passing it into the DEoptim()
function. 同样,最后一行的错误是缺少returns_covar
参数,但是我尝试将其传递给DEoptim()
函数。
I think the above has a parenthesis error, so I've tried the following 我认为以上内容有括号错误,因此我尝试了以下内容
optim_result <- DEoptim(calculate_portfolio_variance, lower, upper, control = list(NP=100, itermax=300, F=0.8, CR=0.9), returns_covar)
This results in the following error: 这将导致以下错误:
Error in allocations %*% returns_covar %*% t(allocations) : non-conformable arguments
When I check the dimensionality of the matrices, everything seems ok 当我检查矩阵的维数时,一切似乎都还好
> dim(allocations)
[1] 1 10
> dim(returns_covar)
[1] 10 10
Adding a dimensionality check within the calculate_portfolio_variance()
function 在calculate_portfolio_variance()
函数内添加维度检查
print(dim(allocations))
print(dim(returns_covar))
shows that the allocation vector becomes NULL
on the second iteration. 显示分配向量在第二次迭代中变为NULL
。 I'm not sure why or how to address it. 我不确定为什么或如何解决。
[1] 1 10
[1] 10 10
NULL
[1] 10 10
Error in allocations %*% returns_covar %*% t(allocations) : non-conformable arguments
Not clear if this is what you intend, but if you change calculate_portfolio_variance
to 尚不清楚这是否是您想要的,但是如果将calculate_portfolio_variance
更改为
portfolio_variance <- t(allocations)%*%returns_covar%*%allocations
It works for me. 这个对我有用。 I think it's an issue with your matrix math. 我认为这与矩阵数学有关。
EDIT full working reproducible example: 编辑完整的可复制工作示例:
library(quantmod)
library(DEoptim)
calculate_portfolio_variance <- function(allocations, returns_covar)
{
# Name: calculate_portfolio_variance
# Purpose: Computes expected portfolio variance, to be used as the minimization objective function
# Input: allocations = vector of allocations to be adjusted for optimality; returns_covar = covariance matrix of stock returns
# Output: Expected portfolio variance
### I CHANGED THIS LINE
#portfolio_variance <- allocations%*%returns_covar%*%t(allocations)
portfolio_variance <- t(allocations)%*%returns_covar%*%allocations
return(portfolio_variance)
}
filter_and_sort_symbols <- function(symbols)
{
# Name: filter_and_sort_symbols
# Purpose: Convert to uppercase if not
# and remove any non valid symbols
# Input: symbols = vector of stock tickers
# Output: filtered_symbols = filtered symbols
# convert symbols to uppercase
symbols <- toupper(symbols)
# Validate the symbol names
valid <- regexpr("^[A-Z]{2,4}$", symbols)
# Return only the valid ones
return(sort(symbols[valid == 1]))
}
# Create the list of stock tickers and check that they are valid symbols
tickers <- filter_and_sort_symbols(c("XLE", "XLB", "XLI", "XLY", "XLP", "XLV", "XLK", "XLU", "SHY", "TLT"))
# Set the start and end dates
start_date <- "2013-01-01"
end_date <- "2014-01-01"
# Gather the stock data using quantmod library
getSymbols(Symbols=tickers, from=start_date, to=end_date, auto.assign = TRUE)
# Create a matrix of only the adj. prices
price_matrix <- NULL
for(ticker in tickers){price_matrix <- cbind(price_matrix, get(ticker)[,6])}
# Set the column names for the price matrix
colnames(price_matrix) <- tickers
# Compute log returns
returns_matrix <- apply(price_matrix, 2, function(x) diff(log(x)))
returns_covar <- cov(returns_matrix)
# Specify lower and upper bounds for the allocation percentages
lower <- rep(0, ncol(returns_matrix))
upper <- rep(1, ncol(returns_matrix))
# Calculate the optimum allocation
set.seed(1234)
### USING YOUR CORRECTED CALL
optim_result <- DEoptim(calculate_portfolio_variance, lower, upper, control = list(NP=100, itermax=300, F=0.8, CR=0.9), returns_covar)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.