- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 873 个
- 通用积分
- 0.0750
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 308 点
- 帖子
- 14
- 精华
- 0
- 在线时间
- 34 小时
- 注册时间
- 2018-5-17
- 最后登录
- 2018-10-18
高中生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
- 873 个
- 通用积分
- 0.0750
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 308 点
- 帖子
- 14
- 精华
- 0
- 在线时间
- 34 小时
- 注册时间
- 2018-5-17
- 最后登录
- 2018-10-18
| 难过 2018-7-2 18:05:24 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
|
29论坛币
每一次寻优得到的最优权重结果,如何能输入到一个矩阵中?就是我加红字的那个权重W
%% 主函数
%% 清空缓存
clc;
clear all;
%% 读取数据,改变数据改动
inputfile ='huang.xlsx'; %(1)数据存储地址,表格的名字
%如果要改变数据,将Excel表格储存在data文件夹中,将‘数据新’改为新的文件名即可
%注意Excel中第一行为标签,下面为数据
[num,txt]=xlsread(inputfile); %读取表格
Data=num(:,1:4); %(2)Data中存放的为待处理的收益率数据
%改变需要改变数据所在的行列数,即num()里的数据为第某行到第某行,第某列到第某列
syms board
board=[23 44 66 89 109 132 154 174 196 218 239 261 284 305 327 349 370 393 414 434 457 479 500 522 544 566 588 609 631 654 675 695 718 739 761 783 804 827 849 870 892 914 936 957 979 1000 1023 1044 1066 1089 1109 1132 1154 1175 1189 1218 1239 1261 1284 1304 1327 1349 1370 1393 1414 1436 1459 1479 1500 1522 1544 1565 1588 1609 1631 1654 1674 1697 1719 1739 1761 1783 1804 1826 1849 1870 1892 1914 1935 1958 1979 2000 2023 2044 2066 2088 2109 2132 2154 2175 2197 2219 2241 2261 2284 2304 2327 2349 2370 2393 2414 2436 2458 2479 ]
%(3)数据的边界
%这里存储的是每月初调仓时数据所在的行数,因为Excel中第一行为标签,所以需要减1
%改变需要改变[]中数据即可
%% 主要算法实现,以下不需要改动
for i=1:size(board,2)-1
data=Data(board(i):board(i+1)-1,:); %选取i月数据
% 数据预处理
Cov=cov(data); %计算协方差
n=size(Cov,1); %数据维度
Aeq=ones(1,n);
beq=ones(1,1); %等式约束
A=-eye(n);
b=zeros(n,1); %不等式约束
w0=[1 0 0 0 ]'; %寻优初始值
% SQP寻优
option = optimset('Algorithm','sqp'); % 使用SQP算法
W = fmincon(@(W) fun(W,Cov),w0,A,b,Aeq,beq); %寻优函数
% 结果显示
disp([num2str(i) '次调仓寻优完成!'])
disp('最优权重为:')
disp(W)
disp('最优权重下风险为:')
disp(fun(W,Cov))
B(i)=W
% 显示MRC
MRC=[];
S=Cov*W;
for j=1:n
MRC(j)=S(j)/sqrt(W'*S);
end
disp([num2str(i) '次调仓MRC为:'])
disp(MRC)
end
disp(MRC)
|
|