计算某省工业部分工业股票与全国工业指数的β值

  第一次发这种自己从头做的,有点小激动哎,虽然文章内容简单,但花费半天时间做这个,还有了结果,感觉蛮值得的,写完这个还得接着去看高代,共勉吧。

(转载加上出处和本文链接就行)

(放在前面:本文部分查阅了蛮多论坛大佬的智慧结晶的,很感谢那些大佬们的帮助,虽然我只是翻阅他们留下的评论,但受益良多,哈哈)

摘要:无,就是计算β值,具体如题,本文不介绍具体数学知识,不介绍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

猜你喜欢

转载自www.cnblogs.com/shendutu/p/12891138.html
今日推荐