第一次发这种自己从头做的,有点小激动哎,虽然文章内容简单,但花费半天时间做这个,还有了结果,感觉蛮值得的,写完这个还得接着去看高代,共勉吧。
(转载加上出处和本文链接就行)
(放在前面:本文部分查阅了蛮多论坛大佬的智慧结晶的,很感谢那些大佬们的帮助,虽然我只是翻阅他们留下的评论,但受益良多,哈哈)
摘要:无,就是计算β值,具体如题,本文不介绍具体数学知识,不介绍CAPM模型的来源、简介、公式说明,如有需要,自行Google
正文:
第一部分
话不多说,简单粗暴,上主程序!具体说明在程序中有,看不懂就留言或是Google。软件:Matlab R2019b
regress函数:帮助文档地址
readtable函数: 帮助文档地址
表: 帮助文档地址
%作者:慎独兔
%时间:2020/05/14
%题目:探讨某省市某工业与全国工业指数的β值
%配套函数:vecsum03,vecsum04(下面有)
%流通市值:circulation market value
%导入数据并计算市场收益率,以及每只股票的月对数收益率
%mcmv0:市场收益率,
clc;clear
[mcmv0,~] = vecsum04("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\工业指数.xlsx");
[Rstock01,cmv01] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock02,cmv02] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock03,cmv03] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock04,cmv04] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock05,cmv05] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock06,cmv06] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock07,cmv07] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock08,cmv08] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock09,cmv09] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
[Rstock10,cmv10] = vecsum03("C:\Users\ACER\Desktop\金融建模设计\新建文件夹\xx\yy.xlsx");
% 计算行业的加权平均收益率(具体公式请客官看第二部分)
Rstock = [Rstock01,Rstock02,Rstock03,Rstock04,Rstock05,Rstock06,Rstock07,Rstock08,Rstock09,Rstock10];
cmv = [cmv01,cmv02,cmv03,cmv04,cmv05,cmv06,cmv07,cmv08,cmv09,cmv10]; % 汇总数据,方便后面循环
Rstock(isnan(Rstock)) = 0; % 将Rstock中的NaN值设为0,不然后面的结果用regress函数做不出来
Rstock(Rstock==inf)= 0; %同理,将Rstock中的inf值设为0
Rstock(Rstock==-inf)= 0;
[lenx,leny] = size(Rstock);
war01 = zeros(89,1); %weighted average r 加权平均收益率,先预分配位置,减少程序运行时间,89是针对数据从2013/1/1-2020/5/13来的,共89个月
temp01 = sum(cmv,2);
for i = 1:1:lenx
temp02 = 0;
for j = 1:1:leny
temp02 = temp02+cmv(i,j)*(Rstock(i,j)/temp01(i,1));
end
war01(i) = temp02;
end
clearvars temp01 temp02 lenx leny Rstock01 Rstock02 Rstock03 Rstock04 Rstock05 Rstock06 Rstock07 Rstock08 Rstock09 ...
Rstock10 cmv01 cmv02 cmv03 cmv04 cmv05 cmv06 cmv07 cmv08 cmv09 cmv10 filename
% 对 war02 mcmv0 进行回归分析(regress函数用法请点击此处)
war02 = [ones(length(war01),1),war01];
[b,bint,r,rint,stats] = regress(mcmv0,war02);
% [b,bint,r,rint,stats] = regress(mcmv0,war01); 万一后面的分析不需要常数项时,用这一行数代替上面两行
% 检验
[n,k]=size(war01);
A = war02'*war02; % 求算信息阵A
C = inv(A); % 求算信息阵的逆阵
RSS = mcmv0'*mcmv0-b'*war02'*mcmv0;% 求算离回归平方和
MSe = RSS/(n-k-1);% 求算离回归方差
se = sqrt(MSe*diag(C)); % 求算回归统计数标准误差
t = b./se; % 回归统计数的 t 测验
p = 2*(1-normcdf(abs(t), 0, 1)); % p值
title = ["Coefficient","Std.Error","t-Statistic","Prob"];
[title;b,se,t,p]
函数 vecsum03:
function [temp1,temp2] = vecsum03(filename, day, clpr, cmv ) % 从xlsx文件导入数据,并计算月对数收益率 % temp1:月对数收益率 % temp2:按月选择的流通市值 % n:数据分析的月份数目 % day:日期列数 % clpr:收盘价列数 % cmv:流通市值列数 if nargin==1 day = 1;clpr = 04;cmv = 15; % 默认设置,具体请针对你的数据而言,看一眼xlsx文件的时间,比在人群中看一眼女神的时间少多了 end y01 = readtable(filename,'PreserveVariableNames',true); % 有关readtable请点击此处 [~,s] = size(y01); % size得到的前一个数据此处用不上,省略 lm = s+2; % lm是lastmonth所在的列数,因为我在表的后面加了两列,month and lastmonth y01 = sortrows(y01,day,'ascend'); %通常从网上下载的数据都是按时间顺序的,分析的时候要改过来 y01.month = month(y01{:,day}); % 这些是matlab的表的基本用法(所以,给你个链接去学习吧) y01.lastmonth = [diff(y01{:,s+1});1]; % 利用diff函数找出月份中与众不同的那一个,所以,它就是每月的最后一天 y02 = table2array(y01(:,[clpr,cmv,lm])); % table2array : 表转数组(应该,可能,大概?!) c = find(y02(:,3)~=0); % 以上的简单操作就是为了这一步,找出每月的最后一天,然后下几步把它轻轻地牵引出来 n = length(c); temp1 = zeros(n,1);temp2 = zeros(n,1); for i = 1:1:n temp1(i) = y02(c(i),1); temp2(i) = y02(c(i),2); end temp1 = [0;log(temp1(2:end,1))-log(temp1(1:end-1,1))]; end
函数 vecsum04:
function [temp1,y02] = vecsum04(filename, daytime, clpr) % 从xlsx文件导入数据,并计算月对数收益率,与vecsum03类似,不做过多介绍了,时间宝贵 % temp1:月对数收益率 % n:数据分析的月份数目 % day:日期列数 % clpr:收盘价列数 if nargin==1 daytime = 1;clpr = 04; end y01 = readtable(filename,'PreserveVariableNames',true); [~,s] = size(y01); lm = s+2; y01 = sortrows(y01,daytime,'ascend'); y01.month = month(y01{:,daytime}); y01.lastmonth = [diff(y01{:,s+1});1]; y02 = table2array(y01(:,[clpr,lm])); c = find(y02(:,2)~=0); n = length(c); temp1 = zeros(n,1); for i = 1:1:n temp1(i) = y02(c(i),1); end temp1 = [0;log(temp1(2:end,1))-log(temp1(1:end-1,1))]; end
第二部分(介绍加权平均收益率的公式,以及上 面程序的结果)
哈哈,若是你能看到这,说明你也是一个不简单的人啊,竟然能顶住我这么多的废话,谢谢你的用心阅读,陌生人。
1. 加权平均收益率:
(图片高糊版本,放在显微镜下应该能看)
其中 Ri,t是某省制造业行业在 t 时刻的收益率,Rk,t是 k 股票在时刻 t 的收益率,Vk,t 是 k 股票在 t 时刻的流通市值,后面的一大长串分式是 k 股票的流通市值占总样本流通市值的比重。
2. 程序结果
2.1 在有常数项的结果之下,结果为:
(高糊版本2.0)(上面一行是常数项,下面一行是有关某省制造业的系数)
猛地一瞅,p 值不行啊,太大了,所以不满足原假设,故常数项?pass
2.2 在没有常数项的情形下重做一下,结果为:
再瞅瞅,嗯,可以了,很好,不错。即 β 值为0.65639。(相关理论请参考CAPM模型(资产定价模型),自行Google吧,或者未来某天闲着的时候再说呗)
备注(想说的):如果你有更好的算法,可以简单介绍下么,可以简单介绍下么,可以简单介绍下么,我写的还是太简单粗暴了。
2020-05-14 21:36:46