linprog 的权重最小化问题
Weights minimization issue with linprog
我正在尝试使用 python(目前失败)来获得比 Excel Solver 提供的优化问题更有效的解决方案。
Matrices
问题是表格AB=C -->D
其中 AB 生成 C,其中矩阵中每一行的 C-D 的绝对值最小化。
我在矩阵 B 中包含七只基金,所有这些基金都具有
形式的地域敞口
FUND_NAME = np.array([UK,USA,EuroZone, Japan,EM,Apac)]
如下
RLS = np.array([0.788743177, 0.168048481,0,0.043208342,0,0])
LIOGLB=np.array([0.084313978,0.578528092,0,0.23641746,0.033709666,0.067030804])
LIONEUR=np.array([0.055032339,0,0,0.944967661,0,0])
STEW_WLDWD=np.array([0.09865472,0.210582713,0.053858632,0.431968002,0.086387178,0.118548755])
EMMK=np.array([0.080150377,0.025212864,0.597285513,0.031832241,0.212440426,0.053078578])
PAC=np.array([0,0.013177633,0.41273195,0,0.510644775,0.063445642])
PICTET=np.array([0.089520913,0.635857603,0,0.218148413,0.023290413,0.033182659])
据此,我需要使用矩阵 (想象中命名为 A) [x1,x2,x3,x4,x5,x6,x7] 构建七只基金的最佳权重] x1+x2+...+x7=1 & 同样对于 i=(1,7)
xi 下界 =0
xi 上限 =0.25
得到实际区域权重(矩阵C)尽可能接近下面的Target数组(对应矩阵D 以上)
Target=np.array([0.2310,0.2576,0.1047,0.1832,0.1103,0.1131])
我试过使用 libprog。但我知道我得到的答案是错误的。
Funds =np.array([RLS,LIOGLB, LIONEUR,STEW_WLDWD, EMMK,PAC,PICTET])
twentyfive=np.full((1, 7), 0.25)
bounds=[0,0.25]
res = linprog(Target,A_ub=Funds,b_ub=twentyfive,bounds=[bounds])
任何人都可以帮助我从 excel 继续前进吗?
这实际上是一个 LAD 回归 问题(LAD=最小绝对偏差),具有一些边约束。可以找到 LAD 回归问题的不同 LP 公式 here。基于稀疏边界问题,我们可以制定LP模型:
这是我将尝试用 linprog 求解的数学模型。着色如下:蓝色符号代表数据,红色符号是决策变量。 x 是我们需要找到的分配(分数),d 是线性拟合的残差,r 是 d.
的绝对值
linprog 需要显式 LP 矩阵。对于上面的模型,这个 A 矩阵看起来像:
有了这个,开发一个 Python 实现就不再困难了。 Python 代码可能如下所示:
import numpy as np
import scipy.optimize as sp
B = np.array([[0.788743177, 0.168048481,0,0.043208342,0,0],
[0.084313978,0.578528092,0,0.23641746,0.033709666,0.067030804],
[0.055032339,0,0,0.944967661,0,0],
[0.09865472,0.210582713,0.053858632,0.431968002,0.086387178,0.118548755],
[0.080150377,0.025212864,0.597285513,0.031832241,0.212440426,0.053078578],
[0,0.013177633,0.41273195,0,0.510644775,0.063445642],
[0.089520913,0.635857603,0,0.218148413,0.023290413,0.033182659]]).T
target = np.array([0.2310,0.2576,0.1047,0.1832,0.1103,0.1131])
m,n = np.shape(B)
A_eq = np.block([[B, np.eye(m), np.zeros((m,m))],
[np.ones(n), np.zeros(m), np.zeros(m)]])
A_ub = np.block([[np.zeros((m,n)),-np.eye(m), -np.eye(m)],
[np.zeros((m,n)),np.eye(m), -np.eye(m)]])
b_eq = np.block([target,1])
b_ub = np.zeros(2*m)
c = np.block([np.zeros(n),np.zeros(m),np.ones(m)])
bnd = n*[(0,0.25)] + m*[(None,None)] + m*[(0,None)]
res = sp.linprog(c,A_ub,b_ub,A_eq,b_eq,bnd,options={'disp':True})
allocation = res.x[0:n]
结果如下:
Primal Feasibility Dual Feasibility Duality Gap Step Path Parameter Objective
1.0 1.0 1.0 - 1.0 6.0
0.3777262386888 0.3777262386888 0.3777262386888 0.6478228594143 0.3777262386888 0.3200496644143
0.08438152300367 0.08438152300366 0.08438152300367 0.8087424108466 0.08438152300366 0.1335722585582
0.01563291142478 0.01563291142478 0.01563291142478 0.8341722620104 0.01563291142478 0.1118298108651
0.004083901923022 0.004083901923022 0.004083901923023 0.7432737130498 0.004083901923024 0.1049630948572
0.0006190254179117 0.0006190254179117 0.0006190254179116 0.8815177164943 0.000619025417913 0.1016021916581
3.504935403199e-05 3.504935403066e-05 3.504935403079e-05 0.9676694788778 3.504935402756e-05 0.1012177893279
5.983549975387e-07 5.98354980932e-07 5.983549810074e-07 0.9885372873161 5.983549719474e-07 0.1011921413019
3.056236812029e-11 3.056401712736e-11 3.056394819773e-11 0.9999489201822 3.056087926755e-11 0.1011915586046
Optimization terminated successfully.
Current function value: 0.101192
Iterations: 8
print(allocation)
[2.31621461e-01 2.50000000e-01 9.07425872e-12 2.50000000e-01
4.45030949e-10 2.39692743e-01 2.86857955e-02]
我正在尝试使用 python(目前失败)来获得比 Excel Solver 提供的优化问题更有效的解决方案。
Matrices
问题是表格AB=C -->D 其中 AB 生成 C,其中矩阵中每一行的 C-D 的绝对值最小化。
我在矩阵 B 中包含七只基金,所有这些基金都具有
形式的地域敞口FUND_NAME = np.array([UK,USA,EuroZone, Japan,EM,Apac)]
如下
RLS = np.array([0.788743177, 0.168048481,0,0.043208342,0,0])
LIOGLB=np.array([0.084313978,0.578528092,0,0.23641746,0.033709666,0.067030804])
LIONEUR=np.array([0.055032339,0,0,0.944967661,0,0])
STEW_WLDWD=np.array([0.09865472,0.210582713,0.053858632,0.431968002,0.086387178,0.118548755])
EMMK=np.array([0.080150377,0.025212864,0.597285513,0.031832241,0.212440426,0.053078578])
PAC=np.array([0,0.013177633,0.41273195,0,0.510644775,0.063445642])
PICTET=np.array([0.089520913,0.635857603,0,0.218148413,0.023290413,0.033182659])
据此,我需要使用矩阵 (想象中命名为 A) [x1,x2,x3,x4,x5,x6,x7] 构建七只基金的最佳权重] x1+x2+...+x7=1 & 同样对于 i=(1,7) xi 下界 =0 xi 上限 =0.25
得到实际区域权重(矩阵C)尽可能接近下面的Target数组(对应矩阵D 以上)
Target=np.array([0.2310,0.2576,0.1047,0.1832,0.1103,0.1131])
我试过使用 libprog。但我知道我得到的答案是错误的。
Funds =np.array([RLS,LIOGLB, LIONEUR,STEW_WLDWD, EMMK,PAC,PICTET])
twentyfive=np.full((1, 7), 0.25)
bounds=[0,0.25]
res = linprog(Target,A_ub=Funds,b_ub=twentyfive,bounds=[bounds])
任何人都可以帮助我从 excel 继续前进吗?
这实际上是一个 LAD 回归 问题(LAD=最小绝对偏差),具有一些边约束。可以找到 LAD 回归问题的不同 LP 公式 here。基于稀疏边界问题,我们可以制定LP模型:
这是我将尝试用 linprog 求解的数学模型。着色如下:蓝色符号代表数据,红色符号是决策变量。 x 是我们需要找到的分配(分数),d 是线性拟合的残差,r 是 d.
的绝对值linprog 需要显式 LP 矩阵。对于上面的模型,这个 A 矩阵看起来像:
有了这个,开发一个 Python 实现就不再困难了。 Python 代码可能如下所示:
import numpy as np
import scipy.optimize as sp
B = np.array([[0.788743177, 0.168048481,0,0.043208342,0,0],
[0.084313978,0.578528092,0,0.23641746,0.033709666,0.067030804],
[0.055032339,0,0,0.944967661,0,0],
[0.09865472,0.210582713,0.053858632,0.431968002,0.086387178,0.118548755],
[0.080150377,0.025212864,0.597285513,0.031832241,0.212440426,0.053078578],
[0,0.013177633,0.41273195,0,0.510644775,0.063445642],
[0.089520913,0.635857603,0,0.218148413,0.023290413,0.033182659]]).T
target = np.array([0.2310,0.2576,0.1047,0.1832,0.1103,0.1131])
m,n = np.shape(B)
A_eq = np.block([[B, np.eye(m), np.zeros((m,m))],
[np.ones(n), np.zeros(m), np.zeros(m)]])
A_ub = np.block([[np.zeros((m,n)),-np.eye(m), -np.eye(m)],
[np.zeros((m,n)),np.eye(m), -np.eye(m)]])
b_eq = np.block([target,1])
b_ub = np.zeros(2*m)
c = np.block([np.zeros(n),np.zeros(m),np.ones(m)])
bnd = n*[(0,0.25)] + m*[(None,None)] + m*[(0,None)]
res = sp.linprog(c,A_ub,b_ub,A_eq,b_eq,bnd,options={'disp':True})
allocation = res.x[0:n]
结果如下:
Primal Feasibility Dual Feasibility Duality Gap Step Path Parameter Objective
1.0 1.0 1.0 - 1.0 6.0
0.3777262386888 0.3777262386888 0.3777262386888 0.6478228594143 0.3777262386888 0.3200496644143
0.08438152300367 0.08438152300366 0.08438152300367 0.8087424108466 0.08438152300366 0.1335722585582
0.01563291142478 0.01563291142478 0.01563291142478 0.8341722620104 0.01563291142478 0.1118298108651
0.004083901923022 0.004083901923022 0.004083901923023 0.7432737130498 0.004083901923024 0.1049630948572
0.0006190254179117 0.0006190254179117 0.0006190254179116 0.8815177164943 0.000619025417913 0.1016021916581
3.504935403199e-05 3.504935403066e-05 3.504935403079e-05 0.9676694788778 3.504935402756e-05 0.1012177893279
5.983549975387e-07 5.98354980932e-07 5.983549810074e-07 0.9885372873161 5.983549719474e-07 0.1011921413019
3.056236812029e-11 3.056401712736e-11 3.056394819773e-11 0.9999489201822 3.056087926755e-11 0.1011915586046
Optimization terminated successfully.
Current function value: 0.101192
Iterations: 8
print(allocation)
[2.31621461e-01 2.50000000e-01 9.07425872e-12 2.50000000e-01
4.45030949e-10 2.39692743e-01 2.86857955e-02]