研报点评
该研报以CAPM为其金融逻辑对全市场进行择时,其预测逻辑为:全市场风险溢价具有持续性(动量),短期市场收益率虽然有波动,但是中期来看,一般会集聚地保持正溢价一段时间,然后切换。对此,只要估计出前期市场期望溢价是否为正,即可买入。
本文逻辑较为通顺,但是也较为简单,采用了比较“炫的”beta与收益率是否有正相关(spearman系数)来衡量,直白来看,类似过去N日市场平均收益率是否大于0,大于0即买入。但是本文的角度和平滑方法值得思考,具有启发意义。
资本资产定价模型 (Capital Asset Pricing Model, CAPM) 是基于风险资产期望收益均衡基础上的预测模型,它起源于马科维茨 (Markowitz, 1952) 提出的现代投资组合理论(Modern Portfolio Theory, MPT) 。在这一理论的基础上,夏普(W. Sharpe,1964),林特纳(J. Lintner, 1965)和莫辛(J. Mossin, 1966)等经济学家通过假设投资者均采用马科维茨模型进行投资行为从而达到市场均衡,推导出单个资产或资产组合的预期收益率公式如下:
在资本资产定价模型的收益率公式中,如果贝塔是固定的,那资本的收益率主要取决于市场的收益率,所以市场上涨高贝塔行业涨幅更大,市场下跌同样高贝塔行业会下跌更多。借助于这一点,可以尝试逆向推断市场的涨跌,当行业涨幅与其贝塔状态基本一致的时候说明市场是上涨的,相反的时候说明市场是下跌的。
读取中信一级行业和万德全A周度行情数据
clear,clc
%% 读取数据
[~, ~, raw] = xlsread(‘C:\Users\maszr\Desktop\beta择时\行业行情数据.xlsx’,‘周度’,‘B3:AE654’);
ret_mat = reshape([raw{:}],size(raw));
clearvars raw;
[~, ~, industry] = xlsread(‘C:\Users\maszr\Desktop\beta择时\行业行情数据.xlsx’,‘周度’,‘B1:AE2’);
industry(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),industry)) = {’’};
[~, ~, datelist] = xlsread(‘C:\Users\maszr\Desktop\beta择时\行业行情数据.xlsx’,‘周度’,‘A3:A654’);
datelist(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),datelist)) = {’’};
datelist = str2num(datestr(datelist,‘yyyymmdd’));
save(‘data’,‘datelist’,‘industry’,‘ret_mat’)
利用导出的市场指数数据,参照原文采用行业周收益率数据进行回测,行业为中信一级行业,基准为万德全A。下面为beta计算和滚动全样本beta计算程序。
滚动计算中信各行业beta
%% 滚动计算beta
clear,clc
load data
N = 100; % 滚动计算Beta周期
beta_mat = zeros(length(datelist),length(ret_mat(1,:))-1);
for i=1:length(ret_mat)-N
beta_mat(i+N,:) = cal_beta(ret_mat(i:i+N-1,1),ret_mat(i:i+N-1,2:end)); % 在这一步,我对beta滞后了一阶,因此后面不用滞后了
end
beta_mat = beta_mat(N+1:end,:);
datelist = datelist(N+1:end,:);
ret_mat = ret_mat(N+1:end,:);
滚动计算beta程序
function beta = cal_beta(y, x)
ret_mat = [y,x];
beta = diag(cov(ret_mat))’;
beta = beta(2:end)/beta(1);
end
参照原文,我们把各个行业的beta数据拿出来进行分析,下面为分析程序,生成29个行业的行业beta,横截面beta排名,该行业历史平均beta。
行业Beta、横截面Rank(Beta)、平均beta
function figplot(y1,y2,y3,datelist,name)
% 生成x轴指标
num = length(datelist);
x_tick_label_loc = 1:floor(num/5):num;
x_tick_label = num2cell(datelist(x_tick_label_loc));
for i=1:length(x_tick_label_loc)
temp = cell2mat(x_tick_label(i));
temp = num2str(temp);
x_tick_label{i} = temp;
end
% 绘图1
figure1 = figure;
axes1 = axes(‘Parent’,figure1);
plot(1:num,y1,’–’,‘Parent’,axes1);
% 绘图2
axes2 = axes(‘Parent’,figure1,‘YAxisLocation’,‘right’,…
‘ColorOrder’,[0 0.5 0;1 0 0;0 0.75 0.75;0.75 0 0.75;0.75 0.75 0;0.25 0.25 0.25;0 0 1],…
‘Color’,‘none’);
hold(axes2,‘all’);
plot1 = plot(1:num,[ones(num,1)*y2,y3],‘Parent’,axes2);
set(axes1, ‘XTick’,x_tick_label_loc);
set(axes1, ‘XTickLabel’, x_tick_label);
set(axes2, ‘XTick’,x_tick_label_loc);
set(axes2, ‘XTickLabel’, x_tick_label);
xlim(axes1,[0 num]);
xlim(axes2,[0 num]);
title(name);
strcat([name,’.jpg’])
saveas(gcf,strcat([name{1},’.jpg’]))
end
%% 滚动计算beta
clear,clc
load data
N = 100; % 滚动计算Beta周期
beta_mat = zeros(length(datelist),length(ret_mat(1,:))-1);
for i=1:length(ret_mat)-N
beta_mat(i+N,:) = cal_beta(ret_mat(i:i+N-1,1),ret_mat(i:i+N-1,2:end)); % 在这一步,我对beta滞后了一阶,因此后面不用滞后了
end
beta_mat = beta_mat(N+1:end,:);
datelist = datelist(N+1:end,:);
ret_mat = ret_mat(N+1:end,:);
%% rank排序
[~,idx] = sort(beta_mat,2);
[~,idx] = sort(idx,2);
各行各业均不同程度地受到国内外宏观经济因素的影响,但所受影响的程度有异。景气程度与宏观经济环境高度相关,并随之呈现周期性循环的行业被称为周期型行业。其特点是产品需求、原材料价格等呈现周期性波动。典型行业如汽车、钢铁、煤炭等。这一类型行业的表现与市场表现联动紧密,通常具有较高的贝塔。与之相反的行业类型被称为防御型行业。这种行业的需求较周期型行业稳定,弹性相对较小,产业的景气程度受宏观经济的影响也相对较小。典型行业如食品、医疗、公用事业等。这一类型行业通常具有较低的贝塔。
尽管每个行业内不同公司的贝塔往往差异巨大, 行业的贝塔也并非一成不变,但长期、综合来看,各个行业的特征属性与其贝塔的关系是基本稳定的。
综合行业时变beta
餐饮旅游、传媒、电力及公用事业、电力设备
电子元器件、房地产、纺织服装、非银行金融
钢铁、国防军工、机械、基础化工
计算机、家电、建材、建筑
交通运输、煤炭、农林牧渔、汽车
轻工制造、商贸零售、石油石化、食品饮料
通信、医药、银行、有色金属
小结
总体来看,基于CAPM择时在金融逻辑上比较完善,但是实际中可能需要大量的调整和摸索,受限于篇幅,下部分研报会对具体实证结果进行复现。