R中的优化代码,我遗漏了什么吗?

R中的优化代码,我遗漏了什么吗?,r,optimization,R,Optimization,我试图通过最大化sharpe比率来优化一个简单策略的参数,如下代码所示。输出结果显然是错误的。你能提供一些帮助吗 library(xts) library(zoo) library(quantmod) library(PerformanceAnalytics) library(TTR) f_opt <- function(x, data){ a <- x[1] b <- x[2] sma <- SMA(Cl(data), n = a) fma <- EMA(C

我试图通过最大化sharpe比率来优化一个简单策略的参数,如下代码所示。输出结果显然是错误的。你能提供一些帮助吗

library(xts)
library(zoo)
library(quantmod)
library(PerformanceAnalytics)
library(TTR)

f_opt <- function(x, data){

a <- x[1]
b <- x[2]

sma <- SMA(Cl(data), n = a)
fma <- EMA(Cl(data), n = b)
signal <- Lag(ifelse(sma < fma, 1, -1))
ret <- Return.calculate(data, method = "discrete") * signal
colnames(ret) <- c("MA Strategy")
ret <- na.omit(ret)

sharpe <- SharpeRatio.annualized(ret, Rf = 0, scale = 252) * -1
return(as.numeric(sharpe))

}

SYMBL <- getSymbols("^GSPC", auto.assign=F, from="2011-01-01", to="2021-02-08") 
data <- na.omit(SYMBL[,4])

optim(par = c(1,1), fn = f_opt, data = data, method = "L-BFGS-B", lower = 1, upper = 200)
库(xts)
图书馆(动物园)
图书馆(quantmod)
库(性能分析)
图书馆(TTR)
f_opt
optim()
及相关方法可以找到光滑曲面的最优解。只需两个参数,就可以通过蛮力计算曲面上的目标函数(为了方便起见,我使用
emdbook
plot3D
软件包中的函数,但使用
for()
循环和内置的
persp()
函数…(下面的代码)可以很容易地做到这一点

我对你的学科领域(金融?)一无所知,也不知道目标函数中到底发生了什么,但优化不起作用一点也不奇怪

我担心的是,可能是参数的非整数值存在问题(这在任何情况下都会给
optim()
带来问题,但可能会建议其他方法),但即使将整数值限制在范围(5-20、180-200)内,我们仍然会得到一个粗糙的表面:

我发现
DEoptim
(差分进化优化)函数对类似问题很有用

d1 <- DEoptim(f_opt, data=data,lower=c(1,1),upper=c(200,200))
## $optim
## $optim$bestmem
##      par1      par2 
##  12.87796 190.91548 
## 
## $optim$bestval
## [1] -1.158693

d1是的,这就是为什么结尾处的*-1我还看到下限是1,起始值是1s。边界是棘手的,可能会有奇怪的行为。你试过其他的起始值吗?我试过了,得到了同样的错误值。我也总是得到相同的BCB起始值,你能解释一下结果中“明显错误”的地方吗?输出中的
convergence 0
表示
optim
认为它是成功的,从不同的起始值得到相同的结果表明它相对稳健。该函数显然没有最小化,只需尝试一些for和b,您就可以找到比out更高的sharpe,我告诉过你们摇滚乐的大好时光吗?很高兴向你学习。是的,我的领域是金融,我正在建立一个框架来回溯测试交易策略。谢谢,保重。