Python:使用CVXOPT进行二次规划

2 投票
1 回答
5260 浏览
提问于 2025-04-17 03:12

我正在使用CVXOPT来进行二次规划,以计算一个投资组合的最佳权重,这个方法叫做均值-方差优化。在这里有一个很好的例子:http://abel.ee.ucla.edu/cvxopt/userguide/coneprog.html#quadratic-programming。不过,例子中的参数是以一种正则化的形式给出的(根据作者的说法)。这个例子比较基础,我想做一个稍微复杂一点的问题,具体来说:

min:

x'Sx  

s.t.:

x'a >= g  
x'1 = 0  
x >= -Wb  
x <= c1 - Wb  

where:
x: active weights of assets (active weight = portfolio weight - benchmark weight)  
S: covariance matrix of asset returns  
a: expected stock excess returns  
g: target gain  
Wb: weights of assets in the benchmark  
c: upper limit (weight) of any asset in the portfolio  

假设所有的变量都是计算出来的或者是已知的。

文档中展示的基本例子是:

min:  

x'Sx  

s.t.  

p'x >= g  
1'x = 1

其中p是资产的收益。

我不太明白的地方(指的是在http://abel.ee.ucla.edu/cvxopt/examples/book/portfolio.html和上面的优化问题中的代码):

1. 我觉得这些参数设置了约束条件,但我不太确定:

G = matrix(0.0, (n,n))
G[::n+1] = -1.0
h = matrix(0.0, (n,1))
A = matrix(1.0, (1,n))
b = matrix(1.0)

2. 我相信这部分是“正则化形式”中的最小化问题,但我不太明白这是什么意思:

mus = [ 10**(5.0*t/N-1.0) for t in xrange(N) ]

3. qp的参数是什么(solver.qp是二次优化器):

xs = [ qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus ]

看文档,我很确定mu*S(第一个参数)是要最小化的目标函数,而-pbar是收益。不过,这看起来像是一个最大化问题(最大化负收益)。

但是,我不知道其他参数是怎么用的。

我希望能得到一些帮助,使用优化器来解决我上面提到的最小化问题和约束条件。

1 个回答

1

我看了文档,觉得你需要用这个函数,并且要传入以下参数。我假设 x 的大小是 n

P = S
q = (0,....0)

A = (1, ...... 1)
b = (0)

G 是从下面的内容垂直叠加而成的:

 -a
 +I_n
 -I_n

这里 I_n 是一个大小为 n x n 的单位矩阵。对应的右边的 h 是:

  -g
  Wb
  ...
  Wb
  C1-Wb
  ...
  C1-Wb

也就是说:有一个 -g,然后是 n 次的 Wbn 次的 C1-Wb

希望这对你有帮助。

撰写回答