股票投资组合-前进优化方法(Walk forward optimization)

来源:互联网 时间:2015-12-05

前进优化方法(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,]

  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)

  1. 测算不同权重配比,最大限度地提高每月月底的夏普比率

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

  1. 组合表现及结果

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)

  1. 加入比较项-非组合下的单只表现

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

  1. 年华收益率比较

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

通过累积收益率、日收益率和最大回撤率,以及年华收益率比较,可以发现采用前进优化方法的投资组合明显优于传统的投资策略。

反馈与建议

  • 参考:The Logical-Invest “Universal Investment Strategy”–A Walk Forward Process on SPY and TLT
  • 作者:ShangFR
  • 邮箱:shangfr@foxmail.com

相关阅读:
Top