问题提出

市场上有n种资产 S (i=1,2,...,n)可以选择作为投资项目,现用数额为M的相当大的资金作一个时

期的投资。这n种资产在这一时期内购买$S_i$的平均收益率为$r_i$,风险损失率为$q_\mathrm{i}$。投资越分散,总的风险越小,总体风险可用投资的$S_i$中最大的一个风险来度量。

购买$S_i$要付交易费(费率$p_i$),当购买额不超过给定值$u_i$时,交易费按购买$u_i$计算。另外,假定同期银行存款利率是$\mathbf{r}_0(\mathbf{r}_0=5\%)$,既无交易费又无风险费。

已知n=4时相关数据如下:

image.png

请给该公司设计一种投资组合方案,即用给定的资金M,有选择地购买若干种资产或存银行生息,使净收益尽可能大,且总体风险尽可能小。

类似模型一,求解模型二:固定盈利水平,优化风险。并根据结果分析参数k的选取。k的取值:[0,0.27],每隔0.001求解一个相应的线性规划问题,记录相应的最优值和最优解。画出k与最优解R对应的散点图。指出k取何值时,模型最为合适,R的值最小。

问题假设

投资数额 M 相当大,为了便于计算,假设 M=1。

投资越分散,总的风险越小。

总体风险用投资风险中 $S_i$ 最大的一个风险来度量。

N 种资产 $S_i$之间是相互独立的。在投资的这一时期内,$r_i,q_i,p_i,r_0$为定值,不受意外因素的影响。净收益和总体风险只受$r_i,q_i,p_i$ 影响,不受其他因素干扰。

模型符号

$\begin{aligned} & S_{i} & & \text{第i种投资项目,如股票,债券等}\\ & r_{i_{}} & & \text{第i种投资项目的平均收益率}\\ & q_{i} & & \text{第i种投资项目的风险损失率}\\ & p_{i} & & \text{第i种投资项目的交易费率}\\ & u_{i} & & \text{第i种投资项目的交易定额}\\ & x_{i} & & \text{第i种投资项目的投资金额}\\ & r_0 & & \text{同期银行利率}\\ & \alpha & & \text{投资风险度}\\ & Q & & \text{总体收益}\\ & \Delta Q & & \text{总体收益的增量}\end{aligned}$

模型建立:

投资者希望找到总盈利至少达到水平k以上,优化到风险最小的投资方案。这样就把多目标变成一个目标的线性规划。

决策变量:

$x_i$

目标函数:

$$
\operatorname*{\mathrm{min}}R=\operatorname*{\mathrm{min}}{\operatorname*{\left\lbrace\mathrm{max}\{q_{i}x_{i},i=0,1\ldots n\}\right\rbrace}}
$$

约束条件:

$$
\sum_{i=0}^{n}(r_{i}-p_{i})x_{i}\geq k
$$

$$
\sum_{1=0}^{n}(1+p_{i})x_{i}=M
$$

$$
x_{i}\geq0,i=0,1,...n
$$

模型求解

把上述题目数据代入公式:

$$
\operatorname*{\mathrm{min}}R=\operatorname*{\mathrm{min}}{\operatorname*{\left\lbrace\mathrm{max}\{q_{i}x_{i},i=0,1\ldots n\}\right\rbrace}}
$$

$$
s.t.\begin{cases}0.05x_0+0.27x_1+0.19x_2+0.185x_3+0.185x_4\geq k\\x_0+1.01x_1+1.02x_2+1.045x_3+1.065x_4=M\\x_i\geq0,i=0,1,2,3,4\end{cases}
$$

import numpy as np
import scipy.optimize as opt
import matplotlib.pyplot as plt

# 配置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

# 定义目标函数和约束
def objective(x, q):
    return np.max(q * x)

def constraint_1(x, k):
    # 盈利约束
    return np.dot([0.05, 0.27, 0.19, 0.185, 0.185], x) - k

def constraint_2(x):
    # 资金约束
    return np.dot([1, 1.01, 1.02, 1.045, 1.065], x) - 1

# 初始化参数
q = np.array([0, 0.025, 0.015, 0.055, 0.026])  # 各资产的风险损失率
k_values = np.arange(0, 0.271, 0.001)  # k值从0到0.27,步长为0.001
R_values = []  # 用于存储最优风险值
x_values = []  # 用于存储最优投资组合

# 对每个k值求解线性规划问题
for k in k_values:
    x0 = np.zeros(5)  # 初始投资组合

    # 约束条件
    cons = [
        {'type': 'ineq', 'fun': constraint_1, 'args': (k,)},
        {'type': 'eq', 'fun': constraint_2}
    ]

    # 目标函数最小化
    result = opt.minimize(objective, x0, args=(q,), constraints=cons, bounds=[(0, None)]*5)

    if result.success:
        # 记录最优风险和投资组合
        R_values.append(result.fun)
        x_values.append(result.x)
    else:
        # 无解的点跳过
        continue

# 剔除无解的点后,绘制k与最优解R的散点图
plt.figure(figsize=(8, 6))  # 调整图像大小
plt.scatter(k_values[:len(R_values)], R_values, color='blue', marker='o', alpha=0.6)

# 找到最优的点
if R_values:
    best_k_index = np.argmin(R_values)
    best_k = k_values[best_k_index]
    best_R = R_values[best_k_index]

    # 标注最优点
    plt.annotate(f'最优点: k={best_k:.3f}, R={best_R:.3f}', 
                 xy=(best_k, best_R), 
                 xytext=(best_k + 0.005, best_R + 0.005),
                 arrowprops=dict(facecolor='red', arrowstyle="->"),
                 fontsize=12, color='red')

# 添加图形标签
plt.xlabel('目标盈利水平 k', fontsize=12)
plt.ylabel('最优风险 R', fontsize=12)
plt.title('k与最优风险 R 的关系', fontsize=14)
plt.grid(True)
plt.show()

# 打印最佳k值和相应的最优解
if R_values:
    print(f"最优的k值为: {best_k}")
    print(f"对应的最优风险 R 为: {best_R}")
    print(f"对应的最优投资组合 x 为: {x_values[best_k_index]}")
else:
    print("没有找到有效的解")

image

最优的k值为: 0.15
对应的最优风险 R 约为: 0.004
对应的最优投资组合 x 为: [0.34063082 0.15701512 0.26026417 0.07137367 0.15091922]

最后修改:2024 年 12 月 13 日
如果觉得我的文章对你有用,请随意赞赏