基于Markovitz统计套利策略

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Markovitz统计套利策略相关的知识,希望对你有一定的参考价值。

这个博库居然不能上图,需要看图的看pdf吧。

基于Markovitz统计套利策略


by lwglucky




电子邮件: [email protected]





摘要


Markovitz是基于风险组合的套利策略,其核心是对资产组合进行最优化组合配置。



1Markovitz的原理

马柯维茨(Markovitz)的均值方差投资组合理论第一次用均值、方差等数学理论和工具探讨了以何种投资方式使投资人收益E(Rp)可能最大,其中E(Ri)Riwi 是权重或者说资金使用百分比.

E(Rp) = w1E(R1) + w2(R2) +  + wi(Ri) = wiRi(1)

该投资组合收益的方差(推导略):

σ2(Rp) = σ2(wiRi) = w2iσ2(Ri) + ijwiwjσ(Ri,Rj)(2)


为了使Eq.1达到期望收益的同时,冒的风险最小,即:

min:σ2(Rp) = w2iσ2(Ri) + wiwjσ(Ri,Rj)
s.twi = 1
(3)


为了达到风险最小的目的,需要考察投资股票间的相关性:协方差和相关系数

σAB = cov(RA,RB) = E(RA - E(RA))(RB - E(RB))(4)
ρAB =
σAB
σAσB
[ - 1,1]
(5)

求解上公式,得到wi的最佳组合。求解这个公式,用计算机吧, matlab和python,R语言为这个公式求解已经做好了。

举例如下:搜索找出两个金融产品其收益与风险如下特征:A:收益率12%,风险(方差)24%;B:收益率6%,风险(方差)24%;相关系数为:-1。构建两组组合方式:

  1. A与B的权重均等都为50%:组合收益率:50%*12%+50%*6%=9%;组合的风险:(50%*24%)^2+ (50%*24%)^2+2*(-1)*50%*50%*24%*24%=0

  2. A与B的权重均等都为30%,70%:组合收益率:30%*12%+70%*6%=7.8%;组合的风险:(30%*24%)^2+ (70%*24%)^2+2*(-1)*30%*70%*24%*24%=0.9%

技术分享

图 1. 有效前沿



2算法



算法 1


allstock[][nday] < N 天的股票数据;

数据清洗,清洗掉那些停牌还有新股。
candidate_stock[][nday] < 过滤掉波动率小于一定阈值的股票 .
计算每一个品种的收益
算出股票收益的协方差,和相关系数矩阵。
确定要股票组合的数量 n。以及此组合股票间的相关系数。
代入公式Eq.3 ,使用计算机不同股票组合求解.


3Matlab实现Markovitz策略

下载数据,方法如下:https://wenku.baidu.com/view/b6c22030cd7931b765ce0508763231126edb778d




clear all;

load ‘D:\workspace\stock\STOCK\2017年10月10日_SHD.mat‘;  %%上海
load ‘D:\workspace\stock\STOCK\2017年10月10日_SZD.mat‘;  %%深圳
all_var = who;
sz999999 = sh999999;  %%大盘数据作为标准数据
rou_theshold = -0.5;  %% 相关系数阈值
[stockvars , ~] = GetStockVars(who);%%%%%%去除非股票数据
% eval( [‘clear‘ clearvars]);  %%%%%%去除非股票数据
nDays = 30;   %%%分析多少天数据
nGroup = 8; %%8只股票组合一组
days = GetNdayStock(sz999999,nDays);   %%%从大盘数据获得最近  nDays 开盘 日期
varthreshold_low = 0.02;  %%选择波动率至少大于2。5%的
varthreshold_up = 1;    %%选择波动率至少小于6%的
clearvars = []; 
stocks = zeros( nDays+1 , length(sz999999(1,:)) , 1);
stock_ret_cell = {};
stocknames = [];
idx = 1;
for k=1:length(stockvars)
    stock = stockvars(k,:);
    eval([ ‘validatedays=‘  ‘length(‘ stock ‘);‘]);
    if validatedays<nDays+1
        continue; 
    end
    eval([‘listdays = ‘ stock ‘(end-nDays:end,1);‘ ]) ;
    if   sum(days-listdays)~=0 %~isequal(days,listdays)  %%时间不匹配的股票不要
        continue; 
    end    
    eval([‘stockdata = ‘ stock ‘(end-nDays:end,:);‘ ]) ;
    stocknames = [stocknames ; stock];
    stocks(:,:,idx) = stockdata;  %%%日期匹配的留下来,放进 stocks
    idx = idx + 1;
end

varstr = ‘‘;
for k=1:length(all_var)
    varstr = [varstr   all_var{k} ‘ ‘]; 
end
eval([ ‘clear ‘ varstr]);  %%清除变量,释放内存
varstr = [];
%%%%上面清理完毕数据

%% 计算收益率
TMP =  (stocks(2:end,5,:) - stocks(1:end-1,2,:))./stocks(1:end-1,2,:); 
TMP = reshape(TMP,size(TMP,1),size(TMP,3));
avgvar = sum(abs(TMP))/nDays;

%% 只组合那些平均波动率介于 varthreshold_low ~ varthreshold_up 的投资组合
stockvars = stocknames;

idx = find(avgvar>varthreshold_low );  
TMP = TMP(:,idx);    
stockvars = stockvars(idx,:);
stocks = stocks(:,:,idx);
avgvar = avgvar(idx);

idx = find(avgvar<varthreshold_up );  
TMP = TMP(:,idx);   
stockvars = stockvars(idx,:);
stocks = stocks(:,:,idx);
avgvar = avgvar(idx);

ExpReturn =zeros(1,size(TMP,2));
for i=1:size(TMP,2)   %% 计算投资收益
    ExpReturn(1,i)=sum(TMP(:,i))/size(TMP,1);
end

ExpCovariance = corrcoef(TMP);  %%  求协相关矩阵
ExpCovariance = triu(ExpCovariance); %%取上三角
ExpCovariance((ExpCovariance>=rou_theshold))=0;  %%% 只取相关系数小于 rou_theshold 的组合

reserverTMP = TMP;

u = 1;

colname =  zeros(1,length(‘A‘:‘Z‘));
temp = ‘A‘:‘Z‘;
for n=1:length(‘A‘:‘Z‘)
    colname(n) = temp(n);
end

RetRisk = [];

for c=nGroup:size(ExpCovariance,2) %%检查每一个v投资 组合。
    r = find(ExpCovariance(:,c)<0 );
    if size(r,1)<nGroup  %% 组合数量小了,就丢掉
        continue;
    end
    %%%找到一组和,计算这个组合资产的有效前沿Markovitiz配比
    r = r‘;
    rs = [c , r];
    for kk=2:size(rs,2)-nGroup
        sidx = [ c , r(kk:kk+nGroup-2)];
        TMP = reserverTMP(:,sidx);
        names = stockvars(sidx,:);
        ExpReturn =zeros(1,size(TMP,2));
        for i=1:size(TMP,2)
            ExpReturn(1,i)=sum(TMP(:,i))/size(TMP,1);
        end
        ExpCov =cov(TMP);
        NumPorts = 18;  %%绘图精度
        %% matlab来算吧,
        p = Portfolio;
        p = setAssetMoments(p, ExpReturn, ExpCov);
        p = setDefaultConstraints(p);
        %%%算吧。。。
        plotFrontier(p, NumPorts); 
        [PortRisk,PortReturn,PortWts]=portopt(ExpReturn,ExpCov,NumPorts);
        %% 保存下来,后面还要筛选
        stock_ret_cell{u}.name = names;  %%组合投资品种名称
        stock_ret_cell{u}.PortRisk = PortRisk;%%风险
        stock_ret_cell{u}.PortReturn = PortReturn; %%收益
        stock_ret_cell{u}.PortWts = PortWts;  %% 权重
        stock_ret_cell{u}.RetRisk = PortReturn(1)/PortRisk(1);  %% 收益风险比
        RetRisk = [RetRisk stock_ret_cell{u}.RetRisk];
        u = u + 1
    end
end

%%存到excel中
[sA index]=sort(RetRisk,‘descend‘);  %按收益风险比排序

%只考察前5名的组合
k = length(index);
if k>=5 
    k= 5;
end

%%存到excel中
for i=1:k
        u = index(i);
        names = stock_ret_cell{u}.name;
        for s=1:nGroup
            xlswrite(‘stock_ret_cell.xls‘,{names(s,:)} , [‘Sheet‘ num2str(u)],[colname(s+2) ‘1‘]);
        end
        xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.RetRisk , [‘Sheet‘ num2str(u)],[colname(s+4) ‘1‘]);
        xlswrite(‘stock_ret_cell.xls‘,{‘风险‘} , [‘Sheet‘ num2str(u)], ‘A1‘ );
        xlswrite(‘stock_ret_cell.xls‘,{‘回报‘} , [‘Sheet‘ num2str(u)], ‘B1‘ );
        xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortRisk , [‘Sheet‘ num2str(u)],‘A2‘);
        xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortReturn ,[‘Sheet‘ num2str(u)],‘B2‘);
        xlswrite(‘stock_ret_cell.xls‘,stock_ret_cell{u}.PortWts , [‘Sheet‘ num2str(u)],‘C2‘);

end


计算 9月1日到10月一日

组合1:

技术分享



技术分享

技术分享

技术分享

技术分享

技术分享


后面组合太多了,就不一一贴图。


本文出自 “坐坐吧” 博客,请务必保留此出处http://lwglucky.blog.51cto.com/1228348/1972291

以上是关于基于Markovitz统计套利策略的主要内容,如果未能解决你的问题,请参考以下文章

金融时间序列分析

R语言无套利区间模型:正向套利和反向套利次数收益率分析华泰柏瑞300ETF可视化

跨期套利策略

策略精选基于时间序列的协整关系的配对交易

比特币自动交易代码和套利机器人 (开源软件)

CtaAlgo vs PyAlgoTrade