2020年五一杯数学建模
B题 基于系统性风险角度的基金资产配置策略分析
原题再现
近年来,随着改革开放程度的不断提高,我国经济运行中的各种风险逐渐暴露并集中传导和体现于金融领域。党的“十九大”报告提出“守住不发生系统性金融风险的底线”要求,并将防范化解重大风险看成决胜全面建成小康社会三大攻坚战的首要战役。
作为金融系统的重要组成部分之一,资产管理业务的风险状况同样是我国金融体制改革过程中值得关注的问题。因此,中国人民银行于2018年出台了《关于规范金融机构资产管理业务的指导意见》,旨在规范金融机构资产管理业务,有效防控金融风险,引导社会资金流向实体经济,更好地支持经济结构调整和转型升级。
公募基金是最具代表性的资产管理业务形态。由于采取相对绩效考核制度,竞争压力使得公募基金资产配置变得非常复杂,持股集中度也相对较高,成为影响系统性风险的潜在因素。因此如何平衡基金投资收益和系统性风险之间的关系值得深入探究。
请考虑下列问题:
1. 附件1提供了2019年十家公募基金公司在股市中的一部分资产配置信息。请以此样本为例,建立合适的数学模型,度量不同基金公司之间资产配置策略的相似性。
2. 附件2提供了2019年样本股票价格数据,假设以所有基金的持股市值总和作为初始财富,以投资效用最大化为目标,请建立合适的数学模型,确定最优的股票投资组合策略(不考虑股票之间的相关性且不允许卖空)。
3. 假设2020年所有基金公司仍然按照2019年的资产配置策略进行投资。请根据附件1和附件2建立合适的数学模型,度量每个基金公司2020年95%置信水平下的风险价值,并进行排序。
4. 如果要求2020年整个系统(所有样本基金公司组成)既能保证投资效用最大化,同时又能使风险价值最低,请建立合适的数学模型,确定最优的股票投资组合策略,并给出投资效用和风险价值。
整体求解过程概述(摘要)
针对本文给出的基金资产配置策略问题,本文建立了结合小波分析算法,均值-方差模型,蒙特卡罗模拟方法以及遗传算法的资产配资投资效益优化模型,对企业购买股票以及合理进行资金的配置具有一定的指导作用。
针对问题一 本文使用皮尔逊相关系数与系统聚类的方法对基金公司的资产配置策略相似性进行度量,将每个公司购买的每种股票的总股价占所有股票总股价的比例作为指标,计算皮尔逊相关系数矩阵,再将比例作为指标进行系统聚类,与相关系数大小做对比,得到基金公司 A、B、C 的资产配置策略相似性较强,基金公司 D、F、G、H、I资产配置相似性较强,基金公司 E、G 与的资产配置策略与其他公司并没有强烈的相关性。
针对问题二 本文结合小波分析算法与均值-方差模型确定使投资效用最大化的股票投资策略,首先补全股价缺失值,使用小波分析算法对数据进行降噪,再使用样条插值补全数据。之后计算协方差矩阵代入均值方差模型求解确定了投资效用最大的策略:总资金的 11.67% 购买股票 7,14.01% 购买股票 16,22.12% 购买股票 22,1.36% 购买股票 32,11.84% 购买股票 43,30.54% 购买股票 50,8.47% 购买股票 57。
针对问题三 本文使用历史模拟法、蒙特卡罗方法,参数模拟法度量每个基金公司2020 年 95% 置信水平下的风险价值,首先检验各股票价格是否服从正态分布,之后用三种方法进行多次模拟,得到平均风险价值最高的基金公司为公司 H,其用三种方法计算得到的风险价值分别为 9832885917 元,1194423950 元,1075206716 元,平均风险价值最低的基金公司为公司 F,其用三种方法计算得到的风险价值分别为 201389015 元,274851565 元,238205436 元。
针对问题四 本文建立了整个系统的兼顾投资效益以及风险价值的投资策略优化模型,并且使用遗传算法,改变初始参数多次进行求解,得到最佳适应度收敛时所对应的股票投资策略,得到当等比例投资股票 5、股票 13、股票 14、股票 19、股票 22、股票 28、股票 37、股票 38、股票 39、股票 54 时,整体适应度最高,其股票收益率期望为 0.0037,整个系统的风险价值为 4088819938 元。
模型假设:
1 假设 2020 年无金融危机、重大自然灾害、卫生事故等影响股票价格及投资者投资策略决策的因素。
2 假设所有决策者的市场信息公开透明并且准确。
3 假设所有投资者均可以根据市场的变化以自身利益最大化、风险最小化为目标进行选股投资。
问题分析:
问题一分析
首先应该解决的是如何将公司的资产配置策略定量表示,之后再考虑如何用数学模型衡量两个公司之间的资产配置的相似性。
问题二分析
首先要理解股票价格变动的规律,用合理的方法补全数据,之后再用已有数据指标定义投资效用,建立约束条件灵活的规划模型,以投资效用最大化为目标,用软件求解。
问题三分析
首先要建立合适的模型对 2020 年的的风险价值进行评估,由于 2019 年的历史数据可以利用,可以用历史模拟法或蒙特卡罗法进行模拟,多次模拟后计算出 95% 置信水平下的风险价值并进行排序。
问题四分析
首先需要建立兼顾效益与风险的投资效益模型,其中问题二的结果可以作为参考,之后再选用合适的方法求解模型,例如 Lingo、智能算法等。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
%根据信号计算噪声强度,给出全局阈值
[thr,sorh,keepapp]=ddencmp('den','wv',x);
%根据全局阈值对信号去噪
xd=wdencmp('gbl',x,'sym4',2,thr,sorh,keepapp);
%用sym4小波对信号做4层分解
[c,l]=wavedec(x,4,'sym4');
%得到每个层次的分层阈值
[thr1,nkeep]=wdcbm(c,l,2);
%根据分层阈值使用软阈值方法对信号去噪
[xd1,cxd,lxd,perf0,perfl2]=wdencmp('lvd',c,l,'sym4',4,thr1,'s');
%绘制原始信号和去噪后信号的图形
subplot(3,1,1);plot(x);title('原始股票单价');
subplot(3,1,2);plot(xd);title('使用全局阈值去噪后的股票单价');
subplot(3,1,3);plot(xd1);title('使用分层阈值去噪后的股票单价');
%gushu为附件一中每家公司的投资股票的股数
%closeprice为补全后的股票每日的收盘价
%%历史模拟法
value=0;
for i=1:10
value = value+gushu(i).*closeprice(:,i);
end
% 投资组合收益率
ret = price2ret(value);
figure;
subplot(2,1,1);
x=1:244;
plot(x,value);
xlabel('时间');
ylabel('组合市值');
title('投资组合市值')
subplot(2,1,2);
plot(x(2:end),ret,'*');
xlabel('时间');
ylabel('收益率');
title('投资组合日收益率')
%绘制投资组合收益率直方图
figure;
histogram(ret,20);
ylabel('天数');
xlabel('投资组合日收益率');
title('历史模拟法投资组合日收益率直方图');
%在5%置信度时,市值亏损的最大比率
Var = -prctile(ret,5) * value(end);
disp(['历史模拟法投资组合VaR为',num2str(Var)]);
%% 蒙特卡罗模拟
%计算日收益率均值和方差
mu = mean(ret);
vol = std(ret);
% 模拟间隔点
nStep = 250;
% 年化波动率
vol = vol * sqrt(nStep);
%资产初始值
s0 = value(1);
% 模拟时长
T = 1;
% 模拟路径数
nPath = 1000;
%用蒙特卡洛模拟1000次
sPath = simulatePath(s0,mu,vol,T,nStep,nPath);
% 绘制蒙特卡罗法模拟路径
figure;
plot(sPath);
xlabel('模拟时间点');
ylabel('组合市值');
title('蒙特卡罗法模拟路径');
% 计算每条模拟路径的var
ret_mc = price2ret(sPath);
Var = -mean(prctile(ret_mc,5)) * value(end);
disp(['蒙特卡罗法投资组合VaR为',num2str(Var)]);
%% 参数模型法
vol = std(ret);
ValueAtRisk = portvrisk(mu,vol);
Var = ValueAtRisk * value(end);
disp(['参数模型法投资组合VaR为',num2str(Var)]);
%%simulatePath函数
function sPath = simulatePath(S0,mu,sigma,T,nStep,nPath)
%S0资产初始值
%T模拟时长
%nStep模拟间隔点
%nPath模拟路径数
%日收益率均值
% mu=r-q
% time step
deltaT = T / nStep;
% initialize stock price matrix
sPath = nan(nStep+1,nPath);
sPath(1,:) = S0;
% Simulated according to ITO's lemma
p1 = (mu - 0.5 * sigma ^ 2 ) * deltaT;
p2 = sigma * sqrt(deltaT);
for i = 1:nPath
for j = 1:nStep
sPath(j+1,i) = sPath(j,i) * exp(p1 + p2 * randn);
end
end
end