跟踪误差最小化—非线性最小二乘法
跟踪误差最小化—非线性最小二乘法Matlab编程
郑志勇 (www.ariszheng.com)
1 理论与
案例
全员育人导师制案例信息技术应用案例心得信息技术教学案例综合实践活动案例我余额宝案例
1.1 非线性最小二乘法
在研究分析中,我们常常使用非线性最小二乘法的方法对数据进行回归或归因分析。数据拟合可以发现数据自身逻辑关系、确定回归模型参数或根据已知数据进行预测分析。数据的非线性最小二乘法是用连续曲线近似的刻画或比拟平面或空间中离散点所表示的坐标之间函数关系的一种数据处理方法,是用解析表达式逼近离散数据的一种方法。
非线性最小二乘法具体分为两个步骤:1.确定拟合模型类型,2确定拟合模型参数。拟合模型类型有线性方程、指数方程、微分方程、多项式方程、混合方程等等。拟合方程的选择是一个复杂的问题。若拟合方程未知,通常使用反复测试的方法,即给定几种备选拟合模型,进行多次拟合,选择拟合效果最好的模型进行拟合。
若拟合模型已确定,则可以通过非线性最小二乘法确定拟合模型参数。 假设:拟合数据为,非线性最小二乘法方程为。 xy,
n2min((,))faxy,(公式1) ,ii,1i
*使用优化方法求解上述为题,等到最小化问题解,即拟合模型参数。 a
1.2跟踪误差最小化背景
指数基金(Index Fund),是以指数成份股为投资对象的基金,即通过购买一部分或全部的某指数所包含的股票,来构建指数基金的投资组合,目的就是使这个投资组合的变动趋势与该指数相一致,以取得与指数大致相同的收益率。1976年美国先锋基金管理公司(Vanguard Fund Co.)推出了世界上第一只真正意义上的指数基金—追踪
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
普尔500指数的Vanguard 500指数基金,从此指数化投资开始正式登上金融舞台。复制指数的方法就有两大类:即完全复制(full replicate)和优化复制(optimized replicate)。完全复制就是购买标的指数中的所有成份证券,并且按照每种成份证券在标的指数中的权重确定购买的比例以构建指数组合从而达到复制指数的目的。以标准普尔500 指数为例,按市值比重购入全部500种成分股就可以完全复制指数。当然,实际情况要复杂的多,因为指数是一个“纸面上的组合”(paper portfolio),每种成份证券在标的指数中的权重时时刻刻在发生变化,以某一时刻的相对权重值来确定组合的结构显然不能保证组合的走势与指数完全一致,因此实务中即便是完全复制也要根据追踪误差的偏离状况对组合进行动态调整。不过,相对于其他复制方法来讲,这种方法的思想还是比较简单明了,而且构建的指数组合与标的指数之间保持高度的一致,较好地继承了标的指数所具有的代表性和投资的分散性,较容易获得比较小的追踪误差(tracking error)。然而这种方法有其优势,但也有很多不足,比如完全复制指数,特别是成分股较多的指数,比如威尔希尔5000全市场指数(Wilshire 5000 Total Market Index)等,所需资金量巨大,一般的投资者根本无此实力来完全复制指数,而且完全复制指数的指数组合通常规
模巨大,如果市场容量较小,市场深度不足,短时间内买入或抛出整个指数组合必然会对市场造成很大的冲击,使得构建指数组合以及随后的组合调整所承受的冲击成本(impact cost)较高。此外完全复制指数还可能面临很大的流动性风险,以及可能导致较高的调整频率和追踪成本。
因此,考虑在最少的追踪误差范围内如何用少量的成分证券(少量资产)来实现对整个标的指数的优化复制(optimized replication)问题就显得尤为重要。所谓的优化复制指的是根据预先设定的标准选择部分成分证券并对其在组合中的相对权重进行优化再配置,从而使得构建出来的指数组合的追踪成本及其与标的指数之间的追踪误差控制在可以接受的范围之内。优化复制的方法又可以进一步细分为分层抽样(stratified sampling)和优化抽样(optimized sampling)两种。前者是两阶段优化法,即第一阶段是抽样,第二阶段则是权重的优化再配置,使得组合的表现与标的指数相一致,同时保证较小的调整频率和追踪成本。与之不同,优化抽样属于单阶段优化法,即把抽样和权重优化再配置同时进行。不过无论是哪种方法都要用到最优化算法模型来进行求解,这是进行权重优化再配置的必经步骤。目前国外所用的最优化算法模型包括二次规划(quadric programming)、线性规划(lineal programming)、鲁棒回归(robust regression)、蒙特卡洛模拟(Monte Carlo simulation)、遗传算法(genetic algorithm)、启发式算法(heuristic algorithm)等多种方法对指数组合进行优化求解。此外,研究者还尝试使用其他一些更复杂的方法来进行建模和求解,如随机控制(stochastic control)和随机规划(stochastic programming)等方法进行求解,这些最优化方法的应用使得指数追踪的效果得到了更好的改进。
2.模型建立
2.1实际案例
案例: 假设以已经选定好的10只股票跟踪沪深300指数为例,选择2009-1-1,2009-6-30为跟踪区间段。如何在2009-1-1日优化配置这10只股票的权重构建积极指数化组合,使其在半年的时间内与沪深300跟踪误差最小。
股票选择为:苏宁电器002024.SZ、上港集团600018.SH、宝钢股份600019.SH、中国
中信证券600030.SH、招商银行600036.SH、中国联通600050.SH、上海石化600028.SH、
汽车600104.SH、贵州茅台600519.SH、中国平安601318.SH。为简易处理,从wind直接提取其向前复权价格。例如,假设某股票2009年1月1日价格为14元,4月1日进行10股
2009年6月30股票价格为15,使用向前复权该股票2009年1月1日复权价格价送3股,
格为14/1.3为10.77,该股票半年投资收益率为(15-10.77)/10.77=39.28%。
表1:历史行情2009-1-1,209-6-30数据表
000300.S002024.S600018.S600019.S600028.S600030.S600036.S
H Z H H H H H
沪深300 苏宁电器 上港集团 宝钢股份 中国石化 中信证券 招商银行 „
„ 日期 收盘价收盘价收盘价收盘价收盘价收盘价收盘价
(元) (元) (元) (元) (元) (元) (元)
„2008-12-31,817.720 11.920 3.250 4.510 6.960 17.650 12.160
„ 1
2009-1-5 1,882.960 11.770 3.370 4.850 7.130 18.530 12.590 2009-1-6 1,942.800 11.450 3.450 4.950 7.340 19.030 13.100 2009-1-7 1,931.180 11.520 3.480 4.940 7.190 18.830 12.870
„2009-1-8 1,887.990 11.130 3.330 4.790 7.080 18.640 12.240
„ 2009-1-9 1,918.370 11.220 3.360 4.820 7.080 18.720 12.450 „„ „„ „„ „
„ 2009-6-22 3,082.560 16.200 5.790 6.810 10.520 29.160 22.220 2009-6-23 3,083.900 16.050 5.670 6.990 10.310 28.320 22.500
„2009-6-24 3,120.730 16.260 5.770 7.200 10.520 28.700 21.760 „
„2009-6-25 3,117.920 16.310 5.690 7.300 10.560 28.220 21.750 „ 2009-6-26 3,128.420 16.020 5.730 7.200 10.460 27.940 21.890 2009-6-29 3,179.970 16.070 5.810 7.240 10.590 27.940 22.750 2009-6-30 3,166.470 16.070 5.730 7.040 10.660 28.260 22.410
2.1数学模型
积极指数化(或者称作优化复制)指的是根据预先设定的标准选择部分成分证券并对其在组合中的相对权重进行优化再配置。如前面章节所述优化复制的方法又可以进一步细分为分层抽样(stratified sampling)和优化抽样(optimized sampling)两种,不过无论是哪种方法都要在权重的优化配置阶段用到最优化算法模型来进行求解。本节主要对使用遗传算法(genetic algorithm)权重的优化配置技术。
进行指数投资组合管理中涉及到很多细节问题,如成份股分红、成份股送股、成份股配股、成份股停盘或者指数成份股调等都会早成跟踪误差扩大。在模型建立时,暂先不考虑上述因素。
积极指数化技术数学模型:
Ltt2MinTExrr()(),,,portindext1,
tt1,,pp,portporttr,,portt1,pport,
,tt,1pp,tindexindex,r,indext,1p,index,N(公式2) tt,,pvp,,portiist.,i,1,mx,i,v,i0,pi,N,x,1,i,i,xiN,,0,(1,2,)…,,i,
tt其中::表述组合跟踪误差;:表示第t日组合收益率,:表示第t日指数rTEx()rindexport
t收益率;:表示组合中股票i的数量;:表述组合中股票i第t日的价格;:表示组vxpiii
合中股票i的初始权重,:表示组合初始投资规模。积极指数化技术数学模型优化目标为m
跟踪误差最小,这里使用标准差定义跟踪误差。
3 MATLAB实现 3.1 lsqnonlin函数
Matlab求解非线性最小二乘法(或非线性拟合)的函数为优化工具箱中(Optimization
Toolbox)的lsqnonlin函数。
Lsqnonlin函数目标问题模型
2222(公式20-3) min()min(()()())fxfxfxfx,,,,…n122xx
fx(),,1,,fx()2,, 其中:fx(),,,…
,,fx()n,,
函数语法:
x = lsqnonlin(fun,x0) x = lsqnonlin(fun,x0,lb,ub) x = lsqnonlin(fun,x0,lb,ub,options)
x = lsqnonlin(problem)
[x,resnorm] = lsqnonlin(...)
[x,resnorm,residual] = lsqnonlin(...) [x,resnorm,residual,exitflag] = lsqnonlin(...) [x,resnorm,residual,exitflag,output] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(...)
输入参数:
Fun: 目标函数 一般用M-文件形式给出
X0: 优化算法初始迭代点
Lb: 变量下届
Up:变量上届
Options: 参数设置
输出参数:
X:最优点输出(或最后迭代点)
Resnorm:残差范数
residual: 残差向量
exitflag: 函数停止信息
1:函数收敛于解x,
2: x小于函数特定阀值
3:残差改变小于函数阀值
4:搜索方向小于函数特定阀值
0:函数达到最大迭代次数
-1:异常停止,请查看output信息
-2:目标问题异常,lb与up矛盾
-4:搜索方程无法使得残差变小
output: 函数基本信息 包括迭代次数,目标函数最大计算次数,使用的算法名称,计算规
模
lambda:拉格朗日乘子
jacobian:jacobian矩阵
注释:优化算法通常通过迭代的方式进行最优解的搜索,理论与过程都比较复杂,上述exitflag信息在此就不再详细的阐述。。由于跟踪误差最小问题是一个典型的凸优化,凸优化解唯一使得跟踪误差最小化的权重相对较简单。
3.2 建立目标函数
步骤一:建立目标函数
ttTExrr()(),,tportindex
tt,1tt,1pp,pp,portportindexindexTEx(),,(公式20-4) ttt,,11ppportindex
Nmx,ttipp,其中,porti0pi,1i
tt其中::表示t日组合跟踪误差;:表示第t日组合收益率,:表示第t日rTEt()rindexport
t指数收益率;:表示组合中股票i的数量;:表述组合中股票i第t日的价格;:表vxpiii示组合中股票i的初始权重,:表示组合初始投资规模。 m
编写目标函数程序M文件,TEobj.m f=TEobj(x, DataX)
输入参数:
x:初始投资权重
DataX:拟合数据
DataX .IndexPrice:指数价格时间序列
DataX.StockPrice:成份股时间序列
DataX.Money:投资总额
注释:DataX使用了结构的概念,相对于f=TEobj(x, IndexPrice,StockPrice,Money)函数输入,
f=TEobj(x, DataX),使用DataX将IndexPrice,StockPrice,Money存储在了结构数据DataX中,
结构数据DataX包含了 DataX .IndexPrice 、DataX.StockPrice、 DataX.Money三个子数据。
输出参数:
F:年化跟踪误差。
程序源码:M文件TEobj.m
function f=TEobj(x, DataX)
%tracking error function
%code by ariszheng@gmail.com 2010-9-1
%使用结构传入拟合参数
%指数数据
IndexPrice= DataX.IndexPrice;
%股票价格数据
StockPrice= DataX.StockPrice;
%投资组合初始资金
Money= DataX.Money;
N=length(x);
%个股购买数量
StockV=zeros(N,1);
L=length(IndexPrice);
PortPrice=zeros(L,1);
StockV=Money*x./StockPrice(1,:)'; %计算组合价值
for i=1:L
PortPrice(i)=StockPrice(i,:)*StockV;
End
%根据资产价值计算收益率
IndexReturn=price2ret(IndexPrice); PortReturn=price2ret(PortPrice); %跟踪误差
f=IndexReturn-PortReturn
程序测试:test.m
十只股票各投10%,x=[0.1,0.1,„„,0.1]
IndexPrice:指数价格时间序列,StockPrice:成份股时间序列在stockdata.xlsx文件中
Money:投资总额为1亿元
%test
%读取矩阵
load StockData
%指数数据
DataX.IndexPrice=IndexPrice; %股票价格数据
DataX.StockPrice=StockPrice; %初始投资金额为1亿
DataX.Money=Money
%股票数据10个
StockNum=10;
初始投资比例各个都为10%
x=ones(StockNum,1)/StockNum; f=TEobj(x, DataX)
%残差平方和
norm(f)
跟踪误差为
X =
IndexPrice: [119x1 double]
StockPrice: [119x10 double]
Money: 100000000 f =
0.0012
0.0067
0.0010
0.0102
0.0083
„„
-0.0045
-0.0034
0.0092
-0.0025
%残差范数
0.0675
3.2 模型求解
我们的目标问题函数为
2222min()min(()()())TExTExTExTEx,,,…n122xx(公式20-5)
stxx.sum()1,0,,ii
上述目标函数中含有约束项,lsqnonlin的标准模型中不含有约束处理,我看可以通过阀函数
方法将约束函数放入目标函数中,使得lsqnonlin求解出的解同时满足约束条件。
10000*(1()),sumx,,
,,TEx()1,,
,,TExTEx()(),2(公式20-6) ,,…,,
,,TEx(),,n
stx..0,i
只有当为0时,目标函数平方和最小。对目标函数f=TEobj(x, DataX) xsumx,,0,1()i
进行修改完善:
程序源码:M文件TEobj.m
function f=TEobj(x, DataX)
%tracking error function
%code by ariszheng@gmail.com 2010-9-1
„„ „„
%根据资产价值计算收益率
IndexReturn=price2ret(IndexPrice);
PortReturn=price2ret(PortPrice);
%跟踪误差
f=IndexReturn-PortReturn;
%%%添加阀函数项%%%
f=[10000*(1-sum(x));f];
注释:目标函数的约束为简单线性约束可以使用阀函数法简单处理,并不代表所有约束
可这样处理。
求解目标函数, M代码程序Solve.m
%%tracking error function
%code by ariszheng@gmail.com 2010-9-1
%求解函数
%读取数据
load StockData
%股票数据
DataX.StockPrice=StockPrice; %初始投资额
DataX.Money=Money;
%指数数据
DataX.IndexPrice=IndexPrice; %股票品种
StockNum=10;
%初始迭代点
b0=ones(StockNum,1)/StockNum; %变量下届为[0,0,„,0],即所有变量大于0
lb=zeros(StockNum,1);
%调用函数计算
[x,resnorm,residual,exitflag,output,lambda,jacobian]...
= lsqnonlin(@(b) TEobj(b,DataX),b0,lb)
%验证是否符合约束
sum(x)
函数运行结果
Optimization terminated: first-order optimality less than OPTIONS.TolFun,
and no negative/zero curvature detected in trust region model.
优化计算最优解
x =
0.0390
0.0624
0.1341
0.1073
0.1408
0.1189
0.0434
0.0838
0.1679
0.1023
残差范数
resnorm =
0.0039
残差
residual =
-0.0000
-0.0020
0.0059
0.0028
0.0041
0.0102
0.0061
-0.0074
0
0.0032
-0.0019
0.0005
-0.0015
-0.0059
0.0081
-0.0063
0.0021
%正常停止迭代
exitflag =
1
output =
firstorderopt: 1.1581e-007
iterations: 4
funcCount: 55
cgiterations: 0
algorithm: 'large-scale: trust-region reflective Newton'
message: [1x137 char]
lambda =
lower: [10x1 double]
upper: [10x1 double] %变量和为1
ans =
1.0000
最优解对应的残差范数为0.0039,相比等权重条件下的残差范数0.0675小很多,说明优化效果显著,且变量和为1符合约束。
表20-2:十股票优化复制沪深300跟踪误差最优的投资比例
002024.SZ 600018.SH 600019.SH 600028.SH 600030.SH 股票 苏宁电器 上港集团 宝钢股份 中国石化 中信证券
3.90% 6.24% 13.41% 10.73% 14.08% 投资比例
600036.SH 600050.SH 600104.SH 600519.SH 601318.SH 股票 招商银行 中国联通 上海汽车 贵州茅台 中国平安
11.89% 4.34% 8.38% 16.79% 10.23% 投资比例
4 扩展问题
跟踪误差最小化使用的过去的信息制定最优的权重组合,问题是这个权重在未来是否是最优的很难判断,为了控制未来跟踪误差通常量化策略采用的方法是行业中性,即保证组合中某个行业的权重与指数中该行业权重一致,即在原问题中添加了行业中性约束。对于行业中性约束,可以将约束方程分析处理,并添加到原问题的中并对上述程序进行修改便可解决带有行业中性约束的跟踪误差最小化问题。