金融学习之五——求解证券投资组合比例

假设现在已知一个证券组合不同时期的收益率以及该时期每支股票的收益率,现在想了解这个证券组合中各支股票的比例,数据如下:

工商银行 建设银行 农业银行 中国银行 组合收益率
0.3731% -0.001838% -0.003087% -0.024112% -0.0105654%
0.021066% 0.001842% -0.000344% 0.011704% 0.0070534%
-0.004854% -0.016544% -0.033391% -0.029563% -0.0256367%
0.006098% -0.003738% 0.007123% -0.01457% -0.0038289%

聪明人一看就知道,这不就是个解方程组的问题嘛,可以将上述数据转换为下列方程组:
0.003731w1-0.001838w2-0.003087w3-0.024112w4=-0.0105654
0.021066w1+0.001842w2-0.000344w3+0.011704w4=0.0070534
-0.004854w1-0.016544w2-0.033391w3-0.029563w4=-0.0256367
0.006098w1-0.003738w2+0.007123w3-0.01457w4=-0.0038289
w1,w2,w3,w4就是我们要求的比例,四个未知数四个方程,应该够算一会儿的吧。
也可以将上述方程组用矩阵进行表示(大家都懂的,这个就不写了)。
这个方程组可以使用scipy模块中的两个子模块中的函数进行求解,下面分别进行说明:
方法1:使用linalg子模块中的solve函数求解,格式为solve(a,b),其中a是N行N列数组,b是一个包含N个元素的一维数组。

import numpy as np
from scipy import linalg
#给定四组不同时期证券组合各支股票的收益率数据
stock=np.array([[0.003731,-0.001838,-0.003087,-0.024112],[0.021066,0.001842,-0.000344,0.011704],[-0.004854,-0.016544,-0.033391,-0.029563],[0.006098,-0.003738,0.007123,-0.01457]])
#给定证券投资组合的收益率数据
stock_return=np.array([-0.0105654,0.0070534,-0.0256367,-0.0038289])
weight=linalg.solve(a=stock,b=stock_return)
stock_name=np.array(['工商银行','建设银行','农业银行','中国银行'])
for i in range(4):
    print(stock_name[i],round(weight[i],2))

结果很直接:
工商银行 0.1
建设银行 0.2
农业银行 0.3
中国银行 0.4
一秒不到就搞定了。
方法2:使用optimize子模块的fsolve函数求解,这个函数的使用格式是fsolve(fx,x0),fx是定义的求解方程组,x0是猜测的初始解。

#定义求解方程组,其实就是要让e1,e2,e3,e4=0
def rate(w):
    w1,w2,w3,w4=w
    e1=0.003731*w1-0.001838*w2-0.003087*w3-0.024112*w4+0.0105654
    e2=0.021066*w1+0.001842*w2-0.000344*w3+0.011704*w4-0.0070534
    e3=-0.004854*w1-0.016544*w2-0.033391*w3-0.029563*w4+0.0256367
    e4=0.006098*w1-0.003738*w2+0.007123*w3-0.01457*w4+0.0038289
    return [e1,e2,e3,e4]
import scipy.optimize as sci
result=sci.fsolve(rate,[0.01,0.01,0.01,0.01])
result

结果为:array([0.1, 0.2, 0.3, 0.4])
和前面的方法结果一样。
OK,现在我们就知道了,如果碰到了方程组求解问题的,就可以使用这两种方法,就看你更喜欢哪种了。

上一篇:Python参数之命名关键字参数


下一篇:【JDBC】ScannerTools类:校验输入