股票投资组合-前进优化方法(Walk forward optimization)
<head>
<title></title>
</head>
<body>
前进优化方法(Walk forward optimization)
交易模型必须能通过历史回测才可以投入使用,无法通过历史回测的交易系统不可能在实际交易中获利,历史回测是交易系统投入实盘的必要前置环节。在现实世界中,大多数交易系统都在同一组历史数据上建模并测试,这样会导致即使通过历史回测的交易系统在实际演练中效果也并不好。因为这组历史数据提供的信息往往是误导性的,它只是评估过程的一部分,而不是全部。因此完全依靠测试结果来判断系统是否有利可图的观念是错误的。
前进优化方法(Walk forward optimization),通过在同一组历史数据上执行一系列“向前看”的市场数据,并同时进行一系列的“向前看”的市场数据测试,从而模拟在现实市场环境下交易策略的不可预测性;通过一步步的向前走不断确定最佳的参数,逐步相关性检验,确认系统有效性,从而完善交易策略。进而帮助缓解使用同一组历史数据上建模导致实际演练中效果不好这一问题。
下面这张图,形象的说明了向前走优化方法与传统历史回测方法的区别:
R语言案例演示Walk forward optimization
前进优化方法在股票投资组合中通过采用偏向于组合波动而非收益率最大限度地提高不同权重下投资组合的夏普率,即使用股票时间窗口最大化一个投资混合在不同权配置下的总回报。
接下来用代码说明从获取数据到输出结果所需的步骤。 1. 股票数据获取及整理
require(quantmod)
require(PerformanceAnalytics)
setSymbolLookup(GZMT=list(name ="600519.SS", src='yahoo')) # 贵州茅台
setSymbolLookup(MSYH=list(name ="600016.SS", src='yahoo')) # 民生银行
getSymbols(c("GZMT", "MSYH"), from="2009-01-01")
## [1] "GZMT" "MSYH"
returns <- merge(Return.calculate(Ad(GZMT)), Return.calculate(Ad(MSYH)), join='inner')
returns <- returns[-1,]
- 不同组合权重下的累计收益率
configs <- list()
for(i in 1:21) {
weightSPY <- (i-1)*.05
weightTLT <- 1-weightSPY
config <- Return.portfolio(R = returns, weights=c(weightSPY, weightTLT), rebalance_on = "months")
configs[[i]] <- config
}
configs <- do.call(cbind, configs)
cumRets <- cumprod(1+configs)
- 测算不同权重配比,最大限度地提高每月月底的夏普比率
period <- 72
roll72CumAnn <- (cumRets/lag(cumRets, period))^(252/period) - 1
roll72SD <- sapply(X = configs, runSD, n=period)*sqrt(252)
sd_f_factor <- 2.5
modSharpe <- roll72CumAnn/roll72SD^sd_f_factor
monthlyModSharpe <- modSharpe[endpoints(modSharpe, on="months"),]
findMax <- function(data) {
return(data==max(data))
}
weights <- t(apply(monthlyModSharpe, 1, findMax))
weights <- weights*1
weights <- xts(weights, order.by=as.Date(rownames(weights)))
weights[is.na(weights)] <- 0
weights\(zeroes <- 1-rowSums(weights)
configs\)zeroes <- 0
- 组合表现及结果
stratRets <- Return.portfolio(R = configs, weights = weights)
rbind(table.AnnualizedReturns(stratRets), maxDrawdown(stratRets))
## portfolio.returns
## Annualized Return 0.2061000
## Annualized Std Dev 0.3152000
## Annualized Sharpe (Rf=0%) 0.6540000
## 4 0.4358557
charts.PerformanceSummary(stratRets)
- 加入比较项-非组合下的单只表现
stratAndComponents <- merge(returns, stratRets, join='inner')
charts.PerformanceSummary(stratAndComponents)
rbind(table.AnnualizedReturns(stratAndComponents), maxDrawdown(stratAndComponents))
## X600519.SS.Adjusted X600016.SS.Adjusted
## Annualized Return 0.182100 0.1611000
## Annualized Std Dev 0.319500 0.3451000
## Annualized Sharpe (Rf=0%) 0.570000 0.4667000
## Worst Drawdown 0.529815 0.4379973
## portfolio.returns
## Annualized Return 0.2061000
## Annualized Std Dev 0.3152000
## Annualized Sharpe (Rf=0%) 0.6540000
## Worst Drawdown 0.4358557
- 年华收益率比较
apply.yearly(stratAndComponents, Return.cumulative)
## X600519.SS.Adjusted X600016.SS.Adjusted portfolio.returns
## 2009-12-31 0.6628246 0.76865724 0.33702777
## 2010-12-31 0.0952092 -0.36536060 -0.34610867
## 2011-12-30 0.1826568 0.19551653 0.15907019
## 2012-12-31 0.1019296 0.45991037 0.57773693
## 2013-12-31 -0.3611985 0.02297592 0.00699064
## 2014-12-31 0.6790561 0.71832221 1.18715154
## 2015-11-26 0.2587723 -0.17880127 0.04664253
通过累积收益率、日收益率和最大回撤率,以及年华收益率比较,可以发现采用前进优化方法的投资组合明显优于传统的投资策略。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步