目标函数的平滑度对于优化的成功至关重要。
可视化目标函数是一种检查平滑度的简便方法。
例如,让我们检查“溃疡指数”( Ulcer Index) ,这是一种风险度量,类似于“标准偏差”。
溃疡指数尝试通过衡量价格回撤来衡量持有交易或投资的压力。溃疡指数基于下降波动性有害、上升拨动性有利的概念。
不像金融行业通常用来衡量股票风险的标准差那样使用同样的权重来衡量上行波动和下行波动,溃疡指数使用了更加明智的方法。它声明投资者们往往只在乎股票的下行风险,并不在乎上行风险(因为在投资者做多的情况下,上行风险是有利的,相当于盈利)。
如果 Ulcer指数 是平滑函数,则可以使用例如非线性求解器轻松地将其用于优化。
#***************************************************************** # 模拟数据 #***************************************************************** load.packages('quantmod') s = c(120,135,10) # 现货价格 r = c(0.15, 0.21,0.3) # 预期回报 sig = c(0.12,0.36,0.17) # 预期标准差矩阵 r12 = 0.33 # 第一和第二资产之间的相关性 r13 = 0.3 # 第一和第三资产之间的相关性 r23 = 0.79 #第二和第三资产之间的相关性 # 构造相关矩阵 r = matrix(1,nr=3,nc=3) r[upper.tri(rho)] = c(r12,r13,r23) # 确保相关矩阵为正定义矩阵 rho = as.matrix(nearPD(rho, T)$mat) #***************************************************************** # 查看模拟价格 #***************************************************************** plota.matplot(scale.one(xts.prices),main='Asset Perfromance')
#***************************************************************** # 计算溃疡指数 #***************************************************************** apply(cho,1, function(x) { if(sum(x) > 1) NA else last(ulcer(x[1]*prices[,1] + x[2]*prices[,2] + 1-sum(x)*prices[,3]) } ) #***************************************************************** #可视化曲面 - 静态 3D 绘图 #***************************************************************** persp(tem, tem, z,col='green',xlab='x',ylab='y'
上面的代码创建了一个很难研究的静态曲面图。
要创建可以用鼠标旋转的交互式3D图,使用:
#***************************************************************** # 可视化曲面 - 交互式 3D 绘图,使用鼠标旋转 #***************************************************************** persp3d(temp, temp, z,col='green',xlab='x',ylab='y')
溃疡指数 曲面光滑,是优化合适的选择。